masquage d'une carte de crédit nombre en java
J'ai essayé de masquer les caractères d'un numéro de carte de crédit aide de la chaîne de caractère 'X'.J'ai écrit deux fonctions ci-dessous .La deuxième fonction utilise commons.lang.StringUtils
classe .J'ai essayé de trouver le temps qu'il faut dans les deux cas
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);
}
Quand j'ai couru ce ,j'ai obtenu ce résultat
maskCCNumber:=5555XXXXXXXX4444 of :16 size
using StringBuffer=0 millis
maskCCNumber:=5555XXXXXXXX4444 of :16 size
using Stringutils=25 millis
Je ne comprends pas pourquoi les communes.StringUtils prend plus de temps que pour la boucle+StringBuffer dans la première fonction.Évidemment, je suis à l'aide de l'api ,dans le mauvais sens..
Quelqu'un peut conseiller sur la façon d'utiliser cette api correctement, dans ce cas?
Faire un tel point de référence est extrêmement complexes (plusieurs pistes, le respect de chauffe, ...). A la
Commentaire mineur: utiliser StringBuilder plutôt que de StringBuffer. StringBuffer n'des synchronisations inutiles.
Pouvez-vous essayer d'affaiblir le numéro de carte de crédit c'est la meilleure façon de sécuriser numéro de carte de crédit..
La première méthode a fonctionné parfaitement pour moi.
StringUtils
classe chargé avant ou est-ce la première fois?Commentaire mineur: utiliser StringBuilder plutôt que de StringBuffer. StringBuffer n'des synchronisations inutiles.
Pouvez-vous essayer d'affaiblir le numéro de carte de crédit c'est la meilleure façon de sécuriser numéro de carte de crédit..
La première méthode a fonctionné parfaitement pour moi.
OriginalL'auteur jimgardener | 2011-09-20
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, si vous prenez les mesures d'un tel court-code en cours d'exécution, vous ne sont souvent pas à obtenir des résultats exacts en raison de la minimale résolution temporelle votre CPU/bibliothèque/quel que soit l'offre (ce qui signifie que vous obtenez habituellement à voir 0ms ou même de faible valeur).
Deuxième et plus important encore, ne pas optimiser ce! "L'optimisation prématurée est la racine de tout mal" et au cas où vous n'avez que quelques ms que vous souhaitez optimiser l'effort est à fond perdu. Vous devez masque millions de cartes de crédit avant de vous même à distance penser à optimiser cette simple masque de méthode.
OriginalL'auteur Frank
Ici vous allez. Nettoyer et réutilisable:
Exemples D'Appels:
Bonne chance.
OriginalL'auteur Ayman
À L'Aide D'Apache StringUtils...
OriginalL'auteur Jeffrey
Ici est un peu plus propre mise en œuvre, basé sur StringUtils, si je ne suis pas sûr de savoir comment il allait effectuer en comparaison à vos implémentations. En tout cas, " l'optimisation prématurée commentaires restent très valable.
final String s = creditCardNumber.replaceAll("\\D", "");
et de mettre à jour le code en conséquence.OriginalL'auteur Michael-7
Plus probablement, c'est le moment de
StringUtils
chargé à partir duapache-commons.jar
fichier. Pas le vrai temps d'exécution.Pour calculer le réel le temps d'exécution, essayez d'exécuter plusieurs fois et de voir comment beaucoup de sp, le 2ème. 3ème jusqu'à 100e à prendre.
De toute façon, comme Frank a dit, l'optimisation à ce niveau n'est pas recommandé.
OriginalL'auteur medopal
Chaîne utils probablement des copies de la chaîne à quelques reprises. par exemple, lorsque vous exécutez le collier.concat(fin); la jvm alloue de la nouvelle chaîne de la taille de deux la concaténation de chaînes de caractères et de les copier. Si vous utilisez StringBuffer vous sauve tous ceux que les copies de la mémoire tampon a déjà attribuée et la concated chaîne venez de copier. faire sens pour moi que le StringBuffer est plus rapide bien que, le temps mesuré semble assez grand alors je m'attends à.
OriginalL'auteur roni
OriginalL'auteur abhinav kumar
Bien que de moins en moins lisible, vous pouvez le faire
À l'aide de Google Étrier sur ma machine pourrait générer environ 20 à 25 ns par rapport à plus de 100 ns avec StringBuilder ou StringUtils.superposition + répéter approches.
OriginalL'auteur Archimedes Trajano
Je sais que ce n'est pas une réponse, mais vous pouvez utiliser une expression régulière et de résoudre cela en une seule étape
Explication:
OriginalL'auteur padippist
Code ci-dessous masque de 75% de la chaîne.
OriginalL'auteur Tint Naing Win
Sortie : XXXXXXXXXXXX6785
OriginalL'auteur Abhilash Khajuria