信用卡号码通过Luhn算法来验证通过。
该校验的过程:
1、从卡号最后一位数字开始,逆向将奇数位(1、3、5等等)相加。
2、从卡号最后一位数字开始,逆向将偶数位数字,先乘以2(如果乘积为两位数,则将其减去9),再求和。
3、将奇数位总和加上偶数位总和,结果应该可以被10整除。
例如,卡号是:5432123456788881
则奇数、偶数位(用红色标出)分布:5432123456788881
奇数位和=35
偶数位乘以2(有些要减去9)的结果:16 2 6 1 5 7 7,求和=35。
最后35+35=70可以被10整除,认定校验通过。
方法如下:
public static boolean isLuhn(String number) { int sumOdd = 0; int sumEven = 0; int length = number.length(); int[] wei = new int[length]; for (int i = 0; i < number.length(); i++) { wei[i] = Integer.parseInt(number.substring(length - i - 1, length - i)); } for (int i = 0; i < length; i++) { if (i % 2 == 0) { sumOdd += wei[i]; } else { if ((wei[i] * 2) > 9) { sumEven += wei[i] * 2 - 9; } else { sumEven += wei[i] * 2; } } } return (sumOdd + sumEven) % 10 == 0; }
调用方式:
for (int i = 0; i <= 9; i++) { String randomId = ”2398123“ + i; if (isLuhn(randomId)) { System.out.println(randomId); } }
扩展知识:
我们知道,公民的身份证是18 位,而最后一位就是校验位。喜欢玩游戏的小伙伴一定都有这样的经历,游戏需要实名认证,而有时候也不想泄露自己的身份证信息。有时候就会随便输入一个身份证,系统就能马上判断出你的身份证是无效的。怎么做到的呢?
把前 17 位分别乘上以下系数,然后相加:

然后把相加的结果模除 11,得到的余数只可能是0-10。余数再按照下表做一次变换,就可以得到最后一位:

当余数是2时,经过上面变换后就是X,这也说明了为什么有些人的身份证最后一位是 X。
实现方法:
public class demo { public static void main(String[] args) { isLuhn("身份证前17位"); } public static boolean isLuhn(String number) { int sumEven = 0; int sumOdd = 0; int length = number.length(); int sumTemp = 0; char[] charArray = number.toCharArray(); int[] intXiShu = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2}; char[] charEnd = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'}; for (int i = 0; i < number.length(); i++) { int num = Integer.parseInt(String.valueOf(charArray[i])); sumTemp += num * intXiShu[i]; } int mod = sumTemp % 11; System.out.println(charEnd[mod]); return false; } }
参考:
https://blog.csdn.net/ganglia/article/details/7059675
https://www.freebuf.com/articles/others-articles/136742.html
浙公网安备 33010602011771号