为啥Luhn算法乘以2?

Posted

技术标签:

【中文标题】为啥Luhn算法乘以2?【英文标题】:Why Luhn algorithm multiply by 2?为什么Luhn算法乘以2? 【发布时间】:2017-06-24 08:08:11 【问题描述】:

我对 Luhn 算法有疑问。用于错误检测和校验和数字的 luhn 算法 (mod 10)。例如签证、信用卡等数字。

例如我们有数字: 数字 1 2 3 4 5 6 7 8 9 3

第 1 步:将交替数字的值乘以 2,开始 从第二个最右边的数字开始。 例子: 数字 1 2 3 4 5 6 7 8 9 3 乘数 X2 X2 X2 X2 X2

Step2:将上述产品的所有单个数字相加 连同原始数字中未加倍的数字。如果超过 10,则加或减 9。 号码。

例子:

Digit       1  2  3  4  5  6  7  8  9  3
Multiplier X2    X2    X2    X2    X2
Result      2  2  6  4 10  6 14  8 18  3
                       1+0   1+4   1+8
Sum         2+ 2+ 6+ 4+ 1+ 6+ 5+ 8+ 9+ 3 = 40

第3步:如果总模10等于0,则数为 根据LUHN公式有效;否则它是 无效的。 例子。 40 mod 10 = 0 所以有效,如果不是 0 那么无效。

问题是,为什么在第 2 步中使用乘以 2?什么原因? (请提供链接参考或论文)。 谢谢

【问题讨论】:

【参考方案1】:

虽然Wikipedia article 中没有给出这个细节的明确理由,但每隔一个数字的乘法可能会实现对相邻位置交换的打字错误的检测。更准确地说,它提到了

Luhn 算法将检测 [.​​..] 几乎所有相邻数字的转置。但是,它不会检测两位数序列 09 到 90 的转置(反之亦然)。

如果相邻位置被置换,校验和可能会改变。如果没有不同的因素(右边的偶数位置为 2,奇数位置为 1),情况就不会如此。

【讨论】:

以上是关于为啥Luhn算法乘以2?的主要内容,如果未能解决你的问题,请参考以下文章

当我们使用 Luhn 算法验证信用卡时,为啥要反转数字?

Luhn算法检验和验证

Luhn 算法逻辑

C:信用卡号码检查器/ Luhn 算法

Luhn算法Ruby无法识别AMEX

程序冻结 - Luhn 算法