Luhn算法,也称为模10算法,是一种简单的校验和算法,常用于验证各种身份识别码,比如银行卡号、国际移动设备识别码(IMEI)、美国国家提供商标识号码等。它能快速地检测出输入中的单一数字错误,例如错位、漏掉或多输入一个数字。
Luhn算法的工作原理
- 从右向左编号: 给要校验的数字字符串从右向左编号,从1开始。
- 隔位求和: 从右向左遍历,偶数位上的数字乘以2。如果乘积大于等于10,则将乘积的各位数字相加。
- 所有数字求和: 将所有数字(包括经过处理的偶数位数字)相加,得到一个总和。
- 判断校验位: 如果总和能被10整除,则校验通过,否则校验失败。
PHP实现Luhn算法
1 | function luhn_check($number) { |
代码解释
- 从右向左遍历: 循环遍历数字字符串,从右向左处理每一位数字。
- 获取当前位上的数字: 数字字符的ASCII码比数字本身大48;这里不能改为$digit = (int)$number[$numDigits - $i - 1];因为如果字符串中包含非数字字符,强制类型转换的结果可能会是0。而 ord() 函数则会更可靠地将字符转换为数字。
- 偶数位处理: 对于偶数位的数字,乘以2,如果结果大于9,则减去9。
- 求和: 将所有处理后的数字相加,得到总和。
- 校验: 判断总和是否能被10整除,如果能整除,则校验通过。
使用示例
1 | $cardNumber = '1234567890123456'; |
Luhn算法的优点
- 简单高效: 算法简单易懂,计算量小,适合快速验证。
- 检测错误能力强: 能检测出大部分的单一数字错误。
Luhn算法的局限性
- 不能检测所有错误: 对于某些特定的错误组合,Luhn算法可能无法检测出来。
- 不是绝对安全: Luhn算法只能作为一种简单的校验手段,不能完全保证数据的正确性。
总结
Luhn算法是一种常用的校验算法,特别适合用于验证身份识别码的正确性。虽然它不能检测所有的错误,但仍然是一种简单有效的校验方法。在实际应用中,可以将Luhn算法与其他校验方式结合起来,提高数据的可靠性。