Luhn算法
Luhn 算法(又称模 10 算法、模 10 校验、Luhn 校验)是一种简单的校验和公式,由 IBM 工程师 Hans Peter Luhn 于 1954 年提出,用来检测数字串在手动录入时产生的偶然错误。它最广为人知的用途是校验银行卡(信用卡)号,此外 IMEI 手机串号、部分国家的社保号等也常用它做末位校验。
计算方法是从最右侧的校验位开始向左编号:把从右往左数第 2、4、6… 位的数字翻倍,若翻倍后大于 9 就减去 9(等价于把结果的两位数各位相加);再将所有数字求和,若总和能被 10 整除,该号码即通过校验。生成校验位时,反过来推出能让总和成为 10 倍数的那一位即可。
使用要点与常见误区:
- 它是
校验和而非加密或安全哈希,只能发现打字、抄写等偶然错误,挡不住蓄意伪造的号码,也不能判断卡是否真实、是否有余额。 - 能查出任意单个数字写错,以及绝大多数相邻两位的互换,但对
09与90这类互换无能为力。 - 通过 Luhn 校验只代表号码「格式合法」,能否真正支付仍需发卡行/支付网关授权。
常见问题
Luhn 算法能防止银行卡被盗刷或伪造吗?
不能。它只是校验和,用来发现录入时的偶然错误,任何人都能按规则造出「通过校验」的号码。真正的安全要靠加密、CVV、3D 验证等手段。
号码通过了 Luhn 校验,是不是就说明卡是真的、能用?
不是。通过校验只说明位数和末位符合格式规则,卡是否真实开户、有效期、余额等都要由发卡行或支付网关进一步确认。
Luhn 为什么归在「哈希加密」分类下,它算加密算法吗?
严格说不算。它本质是错误检测的校验和,不涉及密钥,也不对数据做不可逆保护;归在这里只是因为它常和编码、校验类工具放在一起。