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

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

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

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

现在我的问题:

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

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

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

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

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

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

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

【问题讨论】:

    标签: algorithm credit-card luhn


    【解决方案1】:

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

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

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

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

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

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

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

    【讨论】:

    • 阅读您的回答后,我也很困惑我是如何检查我的卡片的。我检查了两张不同的卡,一张说万事达卡,一张说签证,并且它们都“已验证”。阅读您的答案后,我将尝试对此进行更多研究,当然我会等待看看可能会出现什么其他答案;)谢谢您的宝贵时间!
    • 有效 PAN 示例; 5555555555554444 luhn=pass verhoeff=fail
    • 再次感谢您的回答,安德鲁。我想我会把这归功于运气。但是你现在帮助我更好地理解了这一点,Alex K,谢谢你的例子。
    猜你喜欢
    • 2012-02-29
    • 2017-01-09
    • 2014-12-25
    • 2019-03-11
    • 2021-07-21
    • 2013-10-21
    • 2013-10-01
    • 1970-01-01
    • 2014-01-20
    相关资源
    最近更新 更多