跳至内容

卢恩算法计算器 - 验证信用卡和IMEI

免费的卢恩算法(模10校验)在线计算器,用于验证信用卡号、手机IMEI设备编号以及加拿大社会保险号等带校验位的证件号码是否合法有效,也可即时在线批量生成符合校验规则、可用于软件测试的模拟号码,帮助开发者高效完成输入验证逻辑和各类边界情况的测试调试相关日常工作。

卢恩算法计算器

操作

检查您的数字是否通过卢恩模10验证

加载计算器...
📚

文档

什么是卢恩算法?

卢恩算法也称为模 10 算法,是一种用于检查一串数字是否可能构成有效识别号码的公式。它用于在信用卡号码、手机上的 IMEI 号码及其他身份代码引发错误之前,发现其中的输入错误。IBM 工程师汉斯·彼得·卢恩在 1954 提交的一项专利中描述了这种方法。

该算法不能证明某个号码真实存在或处于有效状态。它只能确认这些数字符合预期模式。一个卡号可能通过卢恩校验,但仍可能是伪造的、已过期的或没有资金支持的。

如何计算卢恩校验和

校验针对号码中的各个数字进行,并从右向左读取。

  1. 从右起第二个数字开始,每隔一个数字将其加倍。
  2. 如果某个数字加倍后大于 9,则从结果中减去 9。(这等同于将结果的两个数字相加,因此 16 会变成 1 + 6 = 7;也等同于 16 − 9 = 7。)
  3. 将所有数字相加:包括加倍后经过调整的数字,以及未进行处理的数字。
  4. 如果总和能被 10 整除,则该号码有效;否则无效。

企业生成新的身份号码时,会反向使用相同步骤。它先选定除最后一位以外的所有数字,执行校验,然后选择最后的“校验位”,使总和能够被 10 整除。

示例:验证卡号

取测试号码 4532015112830366。

  1. 从右向左排列的数字:6、6、3、0、3、8、2、1、1、5、1、0、2、3、5、4
  2. 每隔一个数字加倍:6、12、3、0、3、16、2、2、1、10、1、0、2、6、5、8
  3. 从所有大于 9 的结果中减去 9:6、3、3、0、3、7、2、2、1、1、1、0、2、6、5、8
  4. 将它们相加:6+3+3+0+3+7+2+2+1+1+1+0+2+6+5+8 = 50
  5. 50 能被 10 整除,因此该号码有效。

示例:无效号码

取 490154203237517,这是一个采用 IMEI 号码格式的 15 位数字号码。

执行相同步骤后,总和为 59。由于 59 不能被 10 整除,该号码无效。

要将其变为有效号码,只需更改最后一位。测试每个可能的末位数字后可知,末位为 8 时,总和变为 60,能够被 10 整除。因此 490154203237518 是有效的卢恩号码,而从 0 到 9 的其他所有末位数字(8 除外)都会产生无效号码。

如何使用此计算器

计算器有两种模式,通过“操作”按钮选择。

验证会在输入号码时对其进行检查,无需按按钮。输入框中出现数字后,结果就会立即显示;下方的分步明细会列出每个数字、加倍并折算后计入的数值,以及总和。

生成会构造一个通过校验的号码。输入框中已有的数字会保留为新号码的开头。计算器会用随机数字填充其余部分,并附加校验位。结果长度为 16 位,这是典型支付卡号的长度;但如果输入的数字已经达到 16 位或更长,结果就会比输入内容多一位。

输入中的空格、短横线和点号会被忽略,因此“4532 0151 1283 0366”与“4532-0151-1283-0366”会按相同方式读取,就像直接输入数字一样。任何其他字符(例如字母)都会被拒绝,并显示错误消息。

卢恩算法的应用领域

  • 支付卡。 Visa、Mastercard、American Express 及其他支付网络会设计卡号,使完整号码通过卢恩校验。结账表单可以利用这一点,在联系支付处理机构之前发现输入错误的数字。
  • IMEI 号码。 分配给手机及其他蜂窝设备的 15 位标识符包含卢恩校验位。
  • 加拿大社会保险号码。 9 位的 SIN 使用相同的校验方式。
  • 美国国家医疗保健提供者标识符(NPI)。 美国的医疗保健提供者会获得 10 位的 NPI,该标识符通过基于卢恩算法的校验进行验证。

卢恩算法无法发现的问题

该算法能够发现任何单个输入错误的数字,无论该数字是什么或位于何处。它还能够发现所有相邻数字互换的情况(例如将“39”输入成“93”),但有一种特例除外:相邻互换 0 和 9,例如将“09”变成“90”。

它还会漏检三种“双数字”错误,即将一对重复数字替换为另一对重复数字:将 22 看成 55、将 33 看成 66,以及将 44 看成 77。由于这些缺口已知且范围有限,卢恩校验对于发现普通输入错误是可靠的,但不能单独视为完整的错误检测系统。

卢恩算法不是安全校验

卢恩算法的设计目的是发现意外的数据输入错误,而不是防止欺诈。通过校验的号码只是在数学上格式正确,仅此而已。实际支付安全取决于卢恩校验之后添加的其他层级,例如卡片的 CVV 代码、地址验证和 3-D Secure 身份验证。卢恩校验只是这些较慢检查之前执行的第一道、成本最低的过滤。

在 JavaScript 中验证号码

1function isValidLuhn(number) {
2  const digits = number.replace(/\D/g, '').split('').map(Number);
3  if (digits.length === 0) return false;
4
5  let sum = 0;
6  let doubleDigit = false;
7  for (let i = digits.length - 1; i >= 0; i--) {
8    let d = digits[i];
9    if (doubleDigit) {
10      d *= 2;
11      if (d > 9) d -= 9;
12    }
13    sum += d;
14    doubleDigit = !doubleDigit;
15  }
16  return sum % 10 === 0;
17}
18

空输入保护很重要:空字符串的数字总和为 0,而 0 能被 10 整除,因此没有保护时,该函数会把完全没有内容的输入判定为有效号码。要寻找校验位而不是测试校验位,应对校验位之前的数字运行相同的循环,但从其中最后一个数字开始加倍,然后计算 (10 - sum % 10) % 10。

常见问题

卢恩算法用于什么?

它用于检查识别号码(例如信用卡号码、IMEI 号码或加拿大 SIN)在内部是否一致。它能在输入错误或数字顺序颠倒导致处理错误之前发现这些问题。

卢恩算法发现错误的准确度如何?

它能够发现每一个单独输入错误的数字,以及几乎所有两个相邻数字互换的情况。它唯一漏检的互换是相邻的 0 和 9。它还会漏检三种特定的“双数字”替换:用 22 替代 55、用 33 替代 66,以及用 44 替代 77。

有效的卢恩号码是否意味着卡片真实存在?

不是。该校验只能确认数字符合预期模式。它无法说明卡片是否存在、是否有效或是否有资金。企业还会增加单独的检查,例如 CVV 代码验证。

不用计算机能进行卢恩校验吗?

可以。它只需要加倍、减法和加法,因此可以手算,也可以使用简单的计算器。这是最初设计的一部分,目的是适用于数字计算机尚不普及的打孔卡时代。

生成的号码是真实卡号吗?

不是。生成器只会生成满足卢恩校验的数字字符串,用于测试输入表单。这些号码没有被任何银行发行,也不能用于支付任何商品或服务。

为什么称为模 10 算法?

因为最后一步会检查总和是否能被 10 整除,在数学中写作“sum mod 10 = 0”。“Mod”是 modulo 的缩写,表示除法所得的余数。

谁发明了卢恩算法?

IBM 工程师汉斯·彼得·卢恩在 1954 提交的一项专利申请中描述了该算法(并于 1960 获批为美国专利 2,950,048)。他还因早期的计算机文本索引研究而知名。