java Luhn算法生成数据 和校验
在网上找了一下luhn的算法代码,但是搜出来基本都是 python 的代码,这里就先记录一下做个笔记
生成代数据
/**
* 生成 Luhn算法
* @param startWith 前缀
* @param totalNum 总位数
* @return
*/
public static String genCardNum(String startWith, int totalNum) {
StringBuffer resBuffer = new StringBuffer(totalNum);
resBuffer.append(startWith);
for (int m = 0; m < (totalNum - startWith.length() -1); m++) {
resBuffer.append(new SecureRandom().nextInt(10));
}
int b[] = new int[totalNum-1];
for (int i = 0; i < totalNum-1; i++) {
b[i] = Integer.valueOf(String.valueOf(resBuffer.charAt(i)));
}
int s = 0;
for (int i = 2; i < (totalNum + 1); i++) {
int t = b[totalNum - i];
if (i % 2 == 0) {
t <<= 1;
t = t/10 + t % 10;
}
s += t;
}
int end = 10 - s % 10;
if(end == 10) {
resBuffer.append("0");
} else {
resBuffer.append(end);
}
return resBuffer.toString();
}
校验数据
/**
* 校验 Luhn算法
* @param cardNo
* @return
*/
public static boolean check(String cardNo) {
int[] cardNoArr = new int[cardNo.length()];
for (int i = 0; i < cardNo.length(); i++) {
cardNoArr[i] = Integer.valueOf(String.valueOf(cardNo.charAt(i)));
}
for (int i = cardNoArr.length - 2; i >= 0; i -= 2) {
cardNoArr[i] <<= 1;
cardNoArr[i] = cardNoArr[i] / 10 + cardNoArr[i] % 10;
}
int sum = 0;
for (int i = 0; i < cardNoArr.length; i++) {
sum += cardNoArr[i];
}
return sum % 10 == 0;
}
参考博客
https://baike.baidu.com/item/Luhn%E7%AE%97%E6%B3%95/22799984
https://blog.51cto.com/binghe001/2924955
https://www.cnblogs.com/cc11001100/p/9357177.html