2011-11-24 120 views
7

首先,我不確定這是否應該在stackoverflow上,但我想我會試着問。信用卡號碼的Luhn或Verhoeff算法

在過去,我一直使用luhn算法進行信用卡號碼錯誤檢查,但今天我想我會在php中實現verhoeff算法,主要是爲了消磨時間。

我測試了一下自己的卡號,它工作的很好,這讓我開始考慮是否應該使用verhoeff over luhn來檢查我的信用卡號碼。

現在我的問題:

會不會有使用過費爾赫夫任何LUHN優勢顯著?

我知道verhoeff在它的實現中稍微複雜一點,它可以檢測到比luhn更多的轉錄錯誤,這自然會讓我相信它有點慢,但除了檢測更多轉錄錯誤和不利(如果你真的可以稱之爲)稍微慢一點,我想不出任何其他真正的差異。

verhoeff算法是否適用於所有主要卡?

我知道luhn會適用於所有主要的卡片,但是verhoeff也適用於所有的卡片嗎?我假設它會適用於所有人,但我認爲我應該檢查。

是否有一個原因,我只見過使用luhn檢查信用卡號碼的人?

作爲一名開發人員,在我所有的時間裏,我只真正見過使用luhn算法檢查信用卡號碼的人。 對此有充分的理由,還是僅僅是luhn更爲人所熟知?

任何幫助將不勝感激,謝謝你的時間。

回答

8

他們是不同的算法,可以給出不同的結果(如果結果總是相同的,那麼他們將相等的權力 - 你已經說過Verhoeff更強大,所以你必須同意有一些數字給出不同的值到Luhn!)。

與信用卡一起使用時,請檢查最後一位數字與其餘的數字。該校驗位存在於卡上(這是固定的),並使用Luhn算法進行計算。

所以你不能使用Verhoeff,因爲信用卡上的最後一位是Luhn。若要使用Verhoeff,則必須更改已存在的(某些)卡的最後一位數字。

設計原始信用卡格式的人有這個選擇(模數歷史細節),並決定與Luhn一起去。他們選擇了。回顧過去,你不能改變他們的決定,因爲盧恩的支票號碼是存在於現有的卡片上的。

(我不知道你是如何管理這個算法來檢查你的卡甲醚你很幸運,或者你的代碼被打破,還是我錯了...。)

簡單來說:它不會工作。他們不一樣,盧恩的選擇是由信用卡發行人做出的。

用更復雜的術語來說:如果兩者兼容,那麼它們在功率上是相等的,並且在切換時沒有意義。你不能有兩個不同功率的校驗和給出相同的結果。這是一個微妙的點,但認爲它...

+0

在閱讀你的答案後,我也很困惑,我如何檢查我的卡。我查了2張不同的卡片,一張說Mastercard,一張說簽證,兩人都「證實」。在閱讀你的答案之後,我將嘗試進一步研究這個問題,當然我會等待看看還有哪些答案可能會出現;)謝謝你的時間! –

+4

示例有效的PAN; 5555555555554444 luhn = pass verhoeff =失敗 –

+0

再一次感謝您的回覆。我想我只會將這一個粉筆寫成運氣。但是你已經幫助我更好地理解了這一點,Alex K,感謝你的榜樣。 –