【发布时间】:2011-11-20 18:58:29
【问题描述】:
我尝试使用字符“X”屏蔽信用卡号字符串中的字符。我编写了两个函数,如下所示。第二个函数使用commons.lang.StringUtils 类。我试图找出两种情况下所需的时间
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);
}
当我运行这个时,我得到了这个结果
maskCCNumber:=5555XXXXXXXX4444 of :16 size
using StringBuffer=0 millis
maskCCNumber:=5555XXXXXXXX4444 of :16 size
using Stringutils=25 millis
我不明白为什么 commons.StringUtils 比第一个函数中的 for loop+StringBuffer 花费更多时间。显然我使用的是 api,错误的方式..
在这种情况下,有人可以建议如何正确使用这个 api 吗?
【问题讨论】:
-
进行这样的基准测试非常复杂(多次运行,尊重预热,...)。
StringUtils类是之前加载的还是第一次加载? -
次要评论:使用 StringBuilder 而不是 StringBuffer。 StringBuffer 会进行不必要的同步。
-
你可以尝试混淆信用卡号码,这是保护信用卡号码的更好方法..
-
第一种方法非常适合我。
标签: java masking apache-commons-lang