信用卡号码的 Luhn 或 Verhoeff 算法

Posted

技术标签:

【中文标题】信用卡号码的 Luhn 或 Verhoeff 算法【英文标题】:Luhn or Verhoeff algorithm for credit card numbers 【发布时间】:2012-01-05 13:46:21 【问题描述】:

首先,我不确定这是否应该在 *** 上,但我想我还是会尝试询问。

以前我一直使用luhn算法对信用卡号进行错误检查,但今天我想我会在php中实现verhoeff算法,主要是为了打发时间。

我在自己的卡号上对其进行了测试,效果很好,这让我开始思考是否应该在未来使用 verhoeff 而不是 luhn 来检查我的信用卡号错误。

现在我的问题:

与 luhn 相比,使用 verhoeff 有什么显着优势吗?

我知道 verhoeff 的实现稍微复杂一些,它可以检测到比 luhn 更多的转录错误,这自然会让我相信它有点慢,但除了检测更多转录错误和显示的优势之外稍微慢一点的优势(如果你真的可以这么说的话),我想不出任何其他真正的区别。

verhoeff 算法是否适用于所有主要卡片?

我知道 luhn 将适用于所有主要牌,但 verhoeff 也适用于所有主要牌吗?我假设它对所有人都有效,但我想我还是应该检查一下。

我只看到有人使用 luhn 来检查信用卡号,这是有原因的吗?

在我作为开发人员的所有时间里,我只真正看到有人使用 luhn 算法来检查信用卡号码。 这是有充分的理由吗,还是仅仅是因为 luhn 的知名度更高?

任何帮助将不胜感激,感谢您的宝贵时间。

【问题讨论】:

【参考方案1】:

它们是不同的算法,可以给出不同的结果(如果结果始终相同,那么它们的功率将相等 - 您已经说过 Verhoeff 更强,因此您必须同意有些数字给出不同的值卢恩!)。

当与信用卡一起使用时,您将最后一位数字与数字的其余部分核对。此校验位存在于卡上(因此是固定的),并使用 Luhn 算法计算。

所以您不能使用 Verhoeff,因为信用卡上的最后一位数字是 Luhn。要改用 Verhoeff,您必须更改(部分)已经存在的卡片的最后一位。

设计原始信用卡格式的人有这个选择(取模历史细节)并决定使用 Luhn。他们选择了。回想起来,您无法更改他们的决定,因为 Luhn 校验位存在于现有卡上。

(我不知道你是怎么用这个算法检查你的卡片的。以太你很幸运,或者你的代码被破坏了,或者我错了......)

简单来说:它不会起作用。它们不一样,Luhn 的选择是由信用卡发卡机构做出的。

用更复杂的术语来说:如果两者兼容,那么它们的功率将相等,并且没有任何切换的意义。你不能有两个不同功率的校验和给出相同的结果。这是一个微妙的点,但请仔细考虑......

【讨论】:

阅读您的回答后,我也很困惑我是如何检查我的卡片的。我检查了两张不同的卡,一张说万事达卡,一张说签证,并且它们都“已验证”。阅读您的答案后,我将尝试对此进行更多研究,当然我会等待看看可能会出现什么其他答案;)谢谢您的宝贵时间! 有效 PAN 示例; 5555555555554444 luhn=pass verhoeff=fail 再次感谢您的回答,安德鲁。我想我会把这归功于运气。但是你现在帮助我更好地理解了这一点,Alex K,谢谢你的例子。

以上是关于信用卡号码的 Luhn 或 Verhoeff 算法的主要内容,如果未能解决你的问题,请参考以下文章

程序冻结 - Luhn 算法

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

如何使用 Luhn 算法创建信用卡验证器?

为啥Luhn算法乘以2?

Java中的Luhn公式实现

银行卡号码的校验规则(Luhn算法/模10算法)