在 Global Verification Authority,你剛被交付了一項關鍵任務。從線上購物到安全登入,這座城市裡數不清的操作,都仰賴信用卡號碼、銀行帳號、交易代碼和追蹤編號這類數值識別碼的正確性。Luhn 演算法是一種簡單的校驗碼公式,用來協助辨識輸入錯誤的號碼。
剛才有一批識別碼送到你的桌上。它們全都必須通過 Luhn 測試,才能確認是合法的。只要有任一項沒通過,就會被標記為無效,藉此避免像是交易錯誤或帳戶驗證失敗這類問題。
你能確保這件事正確完成嗎?許多服務的完整性都取決於你喔。
判斷一個號碼是否符合 Luhn 公式。
這個號碼會以字串的形式提供。
長度為 1 或更短的字串無效。 輸入中允許有空格,但檢查前應先將它們移除。 其他所有非數字字元都不允許。
要檢查的號碼是4539 3195 0343 6467。
Luhn 演算法的第一步是從號碼的末端開始,將每隔一位的數字加倍,也就是從右邊數來第二位開始,往左移動。
4539 3195 0343 6467
↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ (double these)
如果某個數字加倍後的結果大於 9,就從該結果中減去 9。 我們會得到:
8569 6195 0383 3437
最後,我們將所有數字相加。 如果總和能被 10 整除,原本的號碼就是有效的。
8 + 5 + 6 + 9 + 6 + 1 + 9 + 5 + 0 + 3 + 8 + 3 + 3 + 4 + 3 + 7 = 80
80 能被 10 整除,所以號碼4539 3195 0343 6467有效!
要檢查的號碼是066 123 468。
我們從號碼的末端開始,將每隔一位的數字加倍,也就是從右邊數來第二位開始,往左移動。
066 123 478
↑ ↑ ↑ ↑ (double these)
如果某個數字加倍後的結果大於 9,就從該結果中減去 9。 我們會得到:
036 226 458
我們將數字相加:
0 + 3 + 6 + 2 + 2 + 6 + 4 + 5 + 8 = 36
36 不能被 10 整除,所以號碼066 123 478無效!
我們會探索 8 種不同版本的 Luhn,從一個非常簡潔的 Ruby 實作開始,接著看看一些指令式與函式風格的做法,最後來到一個讓 Erik 和 Jeremy 花了一番功夫才解讀出來的 SQLite 版本!