目录
1.简介与描述
Luhn算法(Luhn algorithm),也称为“模10”(Mod 10)算法,是一种简单的校验和算法,一般用于验证身份识别码,例如发卡行识别码、国际移动设备辨识码(IMEI),美国国家提供商标识号码,或是加拿大社会保险号码。该算法由IBM科学家Hans Peter Luhn创造,专利于1954年1月6日申请。 该算法现已属于公有领域并得到了广泛的应用,例如ISO/IEC 7812-1。它不是一种安全的加密哈希函数,设计它的目的只是防止意外出错而不是恶意攻击。
该校验的过程:
1、从卡号最后一位数字开始,逆向将奇数位(1、3、5等等)相加。
2、从卡号最后一位数字开始,逆向将偶数位数字,先乘以2(如果乘积为两位数,则将其减去9),再求和。
3、将奇数位总和加上偶数位总和,结果应该可以被10整除。
例如,卡号是:5432 1234 5678 8881
奇数位分布:4,2,2,4,6,8,8,1
奇数位和=35;
偶数位分布(乘2,如果为两位数以减去9):1,6,2,6,1,5,7,7
偶数位和=35。
最后35+35=70可以被10整除,认定校验通过。
2.代码实现
public static boolean check(int[] digits) {
int sum = 0;
int length = digits.length;
for (int i = 0; i < length; i++) {
int digit = digits[length - i - 1];
if (i % 2 == 1) {
digit *= 2;
}
sum += digit > 9 ? digit - 9 : digit;
}
return sum % 10 == 0;
}
其他
ISBN国际标准书号和我国的身份证号码,也有类似的校验方式。其中ISBN包含10个数字,我国身份证(二代)为18位,都是使用最后一位作为校验位,也即最后一位是可以基于前面的数字进行推断。具体可参考“ISBN、一个18位身份证和计算信用卡(Luhns)的算法,ISBN、一个18位身份证和计算信用卡(Luhns)的算法_ivbapplication的专栏-CSDN博客”。
参考文档
Luhn算法_百度百科,Luhn算法_百度百科
银行卡校验规则(Luhn算法),银行卡校验规则(Luhn算法)_ywt_go的专栏-CSDN博客_luhn算法