die Maskierung einer Kreditkarte Zahl in java
Ich versuchte, die Maske der Zeichen in einer creditcard number string verwenden von Zeichen 'X'.Ich schrieb zwei Funktionen, wie unten beschrieben .Die zweite Funktion verwendet commons.lang.StringUtils
Klasse .Ich habe versucht, die Zeit zu finden es dauert in beiden Fällen
public static String maskCCNumber(String ccnum){
long starttime = System.currentTimeMillis();
int total = ccnum.length();
int startlen=4,endlen = 4;
int masklen = total-(startlen + endlen) ;
StringBuffer maskedbuf = new StringBuffer(ccnum.substring(0,startlen));
for(int i=0;i<masklen;i++) {
maskedbuf.append('X');
}
maskedbuf.append(ccnum.substring(startlen+masklen, total));
String masked = maskedbuf.toString();
long endtime = System.currentTimeMillis();
System.out.println("maskCCNumber:="+masked+" of :"+masked.length()+" size");
System.out.println("using StringBuffer="+ (endtime-starttime)+" millis");
return masked;
}
public static String maskCCNumberCommons(String ccnum){
long starttime = System.currentTimeMillis();
int total = ccnum.length();
int startlen=4,endlen = 4;
int masklen = total-(startlen + endlen) ;
String start = ccnum.substring(0,startlen);
String end = ccnum.substring(startlen+masklen, total);
String padded = StringUtils.rightPad(start, startlen+masklen,'X');
String masked = padded.concat(end);
long endtime = System.currentTimeMillis();
System.out.println("maskCCNumber:="+masked+" of :"+masked.length()+" size");
System.out.println("using Stringutils="+(endtime-starttime)+" millis");
return masked;
}
public static void ccNumberMaskingDemo() {
String mcard1="5555555555554444";
maskCCNumber(mcard1);
maskCCNumberCommons(mcard1);
}
Wenn ich diese lief ,bekam ich dieses Ergebnis
maskCCNumber:=5555XXXXXXXX4444 of :16 size
using StringBuffer=0 millis
maskCCNumber:=5555XXXXXXXX4444 of :16 size
using Stringutils=25 millis
Kann ich nicht verstehen, warum die commons.StringUtils ist mehr Zeit nehmen, als die for-Schleife+StringBuffer in der ersten Funktion.Offensichtlich bin ich mit der api ,der falsche Weg..
Kann jemand raten, wie diese api korrekt in diesem Fall?
- So ein benchmark ist sehr kompliziert (mehrere Durchläufe, Respekt, Aufwärmen, ...). War die
StringUtils
Klasse geladen wird, bevor oder ist das das erste mal? - Kleine Anmerkung: verwenden Sie die Klasse StringBuilder statt StringBuffer. StringBuffer macht unnötige Synchronisierungen.
- Können Sie versuchen, die Verschleierung der Nummer der Kreditkarte das ist besserer Weg, um sichere Kreditkarten-Nummer..
- Erste Methode funktioniert für mich perfekt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erstens, wenn Sie Messungen vornehmen, der einem so kurzen code, die Sie oft nicht bekommen genaue Ergebnisse durch die minimale zeitliche Auflösung, die CPU/library/was auch immer bietet (was bedeutet, dass Sie in der Regel zu sehen bekommen 0ms oder der gleichen kleinen Wert, über und über).
Zweite und noch wichtiger ist, nicht zu optimieren! "Vorzeitige Optimierung ist die Wurzel allen übels" und in einem Fall, wo Sie nur ein paar ms, das Sie optimieren möchten, der Aufwand ist gründlich verschwendet. Sie müssten die Maske, die Millionen von Kreditkarten, bevor Sie auch nur im entferntesten denken über die Optimierung dieser einfachen Maske Methode.
Hier gehen Sie. Reinigen und wiederverwendbar:
Beispiel Ruft:
Glück.
Apache StringUtils...
Hier ist ein sauberer, Implementierung, basierend auf StringUtils, aber ich bin nicht sicher, wie Sie es durchführen würden, im Vergleich zu den Implementierungen. Jedenfalls, die "vorzeitige Optimierung' Kommentare bleiben sehr gültig.
final String s = creditCardNumber.replaceAll("\\D", "");
und den code entsprechend aktualisieren.Ich weiß, das ist nicht eine Antwort, aber Sie können reguläre Ausdruck und lösen Sie diese in einem Schritt
Erklärung:
Meisten wahrscheinlich, es ist die Zeit der
StringUtils
geladen von derapache-commons.jar
- Datei. Nicht die Reale Ausführungszeit.Berechnung der realen Ausführungszeit, versuchen zu laufen, mehrere Male und sehen, wie viel ms die 2te. 3. bis zu 100 nehmen.
Sowieso, wie Frank sagte, die Optimierung auf dieser Ebene wird nicht empfohlen.
String-utils wahrscheinlich kopiert die Zeichenfolge ein paar mal. zum Beispiel, wenn Sie ausführen gepolstert.concat(Ende); die jvm reserviert neuen string mit der Größe der beiden concat strings und kopieren Sie Sie. Wenn Sie mit StringBuffer Sie speichert alle diese Kopien als Puffer hat bereits Platz zugewiesen, und die concated string einfach kopiert. die für mich Sinn machen, dass der StringBuffer ist schneller, obwohl die Zeit gemessen, die scheint ziemlich groß ist, dann würde ich erwarten.
Obwohl weniger lesbar, Sie können dies tun,
Mithilfe von Google Bremssattel auf meinem Rechner ergeben würde etwa 20-25 ns im Vergleich zu über 100 NS mit StringBuilder oder StringUtils.overlay + wiederholen Ansätze.
Code unten wird die Maske 75% des Strings.
Out put : XXXXXXXXXXXX6785