用于信用卡号码的Luhn或Verhoeff算法

时间:2011-11-24 11:22:11

标签: algorithm credit-card luhn

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

过去我总是使用luhn算法进行信用卡号码的错误检查,但今天我想我会在php中实现verhoeff算法,主要是为了消磨时间。

我用我自己的卡号测试了它并且工作正常,这让我开始考虑是否应该使用verhoe而不是luhn来进行我的信用卡号错误检查。

现在我的问题:

使用verhoe而不是luhn会有什么显着的优势吗?

我知道verhoeff在它的实现中稍微复杂一点,它可以检测到比luhn更多的转录错误,这自然会让我相信它有点慢,但除了检测更多转录错误的优势和dis- <(如果你真的可以称之为)稍微慢一点的优点,我想不出任何其他真正的差异。

verhoeff算法适用于所有主要卡吗?

我知道luhn将适用于所有主要卡片但是verhoeff也适用于所有这些卡片吗?我假设它适用于所有人,但我认为无论如何我应该检查。

我是否有理由认为有人使用luhn检查信用卡号码?

在我作为开发人员的所有时间里,我只是真的看到人们使用luhn算法检查信用卡号码。 这有充分的理由吗,还是简单地说luhn更为人所知?

任何帮助将不胜感激,谢谢你的时间。

1 个答案:

答案 0 :(得分:9)

它们是不同的算法并且可以给出不同的结果(如果结果总是相同然后它们的功率相等 - 你已经说Verhoeff更强,所以你必须同意有一些数字给出不同的值LUHN!)。

与信用卡一起使用时,您可以根据该号码的其余部分检查最后一位数字。该校验位出现在卡上(因此是固定的)并使用Luhn算法计算。

所以你不能使用Verhoeff,因为信用卡的最后一位数字是Luhn。要使用Verhoeff,你必须改变已经存在的(某些)牌的最后一位数。

设计原始信用卡格式的人有这个选择(模数历史细节)并决定与Luhn一起去。他们选择了。你不能在回顾中改变他们的决定,因为Luhn校验位出现在现有卡片上。

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

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

在更复杂的术语中:如果两者兼容,那么它们的功率相等,切换就没有意义。您不能有两个不同功率的校验和,它们会产生相同的结果。这是一个微妙的观点,但考虑一下......