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.
InformationsquelleAutor jimgardener | 2011-09-20
Schreibe einen Kommentar