Maskierung einer Kreditkartennummer in Java

7

Ich habe versucht, die Zeichen in einem Kreditkartennummernstring mit dem Zeichen 'X' zu maskieren. Ich schrieb zwei Funktionen wie folgt. Die zweite Funktion verwendet commons.lang.StringUtils class. Ich habe versucht, die Zeit in beiden Fällen zu finden

%Vor%

Als ich das ausgeführt habe, habe ich dieses Ergebnis erhalten

%Vor%

Ich kann nicht verstehen, warum commons.StringUtils mehr Zeit in Anspruch nimmt als die for-Schleife + StringBuffer in der ersten Funktion. Offensichtlich benutze ich die api, die falsche Art.

Kann jemand in diesem Fall sagen, wie man diese API richtig benutzt?

    
jimgardener 20.09.2011, 05:39
quelle

10 Antworten

5

Erstens, wenn Sie Messungen eines solchen kurzen Codes durchführen, erhalten Sie oft keine genauen Ergebnisse aufgrund der minimalen Timing-Auflösung, die Ihre CPU / Bibliothek / was auch immer bietet (was bedeutet, dass Sie normalerweise 0ms oder die gleichen kleinen sehen) Wert immer und immer wieder).

Zweitens und noch wichtiger, optimieren Sie das nicht! "Vorzeitige Optimierung ist die Wurzel allen Übels" und in einem Fall, in dem Sie nur wenige ms haben, die Sie optimieren möchten, wird der Aufwand gründlich verschwendet. Sie müssten Millionen von Kreditkarten maskieren, bevor Sie im Entferntesten darüber nachdenken sollten, diese einfache Maskenmethode zu optimieren.

    
Frank 20.09.2011, 05:45
quelle
13

Hier gehen Sie. Sauber und wiederverwendbar:

%Vor%

Beispielaufrufe:

%Vor%

Viel Glück.

    
Ayman 15.07.2013 13:56
quelle
6

Hier ist eine etwas sauberere Implementierung basierend auf StringUtils, obwohl ich nicht sicher bin, wie es sich im Vergleich zu Ihren Implementierungen verhalten würde. Auf jeden Fall behalten die Kommentare "vorzeitige Optimierung" ihre Gültigkeit.

%Vor%     
Michael-7 30.05.2012 02:20
quelle
4

Verwenden von Apache StringUtils ...

%Vor%     
Jeffrey 14.11.2013 16:43
quelle
2

Wahrscheinlich ist dies der Zeitpunkt, zu dem StringUtils aus der Datei apache-commons.jar geladen wird. Nicht die tatsächliche Ausführungszeit.

Um die tatsächliche Ausführungszeit zu berechnen, versuchen Sie mehrmals zu laufen und sehen Sie, wie viel ms der zweite ist. 3. bis 100. wird dauern.

Jedenfalls wird, wie Frank sagte, eine Optimierung auf dieses Niveau nicht empfohlen.

    
medopal 20.09.2011 05:52
quelle
2

String utils kopiert die Zeichenfolge wahrscheinlich einige Male. zum Beispiel, wenn Sie gepolstert.concat (Ende) ausführen; Der jvm weist eine neue Zeichenfolge mit der Größe der beiden Concat-Zeichenfolgen zu und kopiert sie. Wenn Sie StringBuffer verwenden, speichern Sie alle diese Kopien, da der Puffer bereits einen Platz zugewiesen hat und der kopierte String dort kopiert wurde. Sinn machen für mich, dass der StringBuffer zwar schneller ist, die gemessene Zeit aber ziemlich groß erscheint, würde ich erwarten.

    
roni 20.09.2011 05:58
quelle
1

Obwohl weniger lesbar, können Sie dies tun

%Vor%

Die Verwendung von Google Caliper auf meinem Computer würde etwa 20-25 ns im Vergleich zu mehr als 100 ns mit StringBuilder oder StringUtils.overlay + repeat Annäherungen ergeben.

%Vor%     
Archimedes Trajano 22.11.2012 20:05
quelle
1
%Vor%     
abhinav kumar 29.04.2016 19:29
quelle
1

Ich weiß, das ist keine Antwort, aber Sie können regulären Ausdruck verwenden und dies in einem Schritt lösen

%Vor%

Erläuterung:

  • Die \ b Grenze hilft zu überprüfen, ob wir der Anfang der Ziffern sind (es gibt andere Möglichkeiten, dies zu tun, aber hier wird dies tun).
  • (\ d {4}) erfasst vier Ziffern für Gruppe 1 und Gruppe 3
  • (\ d {8}) erfasst acht Ziffern für Gruppe 2
  • Bei der Ersetzung enthalten $ 1 und $ 3 den Inhalt der Gruppen 1 und 3
padippist 14.07.2016 12:44
quelle
-1
%Vor%

Ausgegeben: XXXXXXXXXXXX6785

    
Abhilash Khajuria 03.06.2016 14:07
quelle