前言
上次說了 HKID Check Digit
今說 Octopus 八達通
它等於是 日本的西瓜卡、台灣的悠遊卡
原來八達通的check digit 也有 驗證公式 流出,海豚現在才知道
Octopus 八達通 Check Digit
使用類似 Luhn algorithm (盧恩算法)
- 將八達通 7~9 個號碼,不包括括號內數字。從右往左,單數位置乘1,雙數位置乘2,如果乘出來的結果是雙位數,則將個位數與十位數相加。
- 把全得數未全部加在一起
- 將結果 mod 10,即除10,取餘數,以10減去餘數,便是校驗位。如能整除沒有餘數,即校驗位為 0
海豚為驗證,買了兩張八達通
右至左數
單數位置:7, 5, 1, 2, 1
雙數位置:0, 2, 0, 0
單數位置:7, 5, 1, 2, 1
雙數位置x2 = :0, 4, 0, 0
如積(乘2後的結果)是雙位數,將個位與十位加總:在這例子沒有
全部相加:
7, 5, 1, 2, 1
0, 4, 0, 0
= 20
能被10 整除,所以 校驗位是0
102012508 (9)
右至左數
單數位置:8, 5, 1, 2, 1
雙數位置:0, 2, 0, 0
單數位置:8, 5, 1, 2, 1
雙數位置x2 = :0, 4, 0, 0
如積(乘2後的結果)是雙位數,將個位與十位加總:在這例子沒有
全部相加:
8, 5, 1, 2, 1
0, 4, 0, 0
= 21
mod 10 結果是 1 ,10-1 = 9,所以 校驗位是9
VISA、MasterCard Check Digit
VISA、MasterCard 信用卡最後個號碼都可以用類似方式計算,從右至左起算,不過單數位置乘2,雙數位置乘1
信用卡沒法去買,海豚拿一些已經取消了的信用卡號碼作試範
Citi VISA 4791-1050-0227-7921
單數位置︰2, 7, 2, 0, 5, 1, 9, 4
雙數位置︰9, 7, 2, 0, 0, 1, 7
單數位置x2 =︰4, 14, 4, 0, 10, 2, 18, 8
如積(乘2後的結果)是雙位數,將個位與十位加總:4, 5, 4, 0, 1, 2, 9, 8
全部相加:
將個位與十位加總:4, 5, 4, 0, 1, 2, 9, 8
雙數位置︰9, 7, 2, 0, 0, 1, 7
= 59
59 mod 10 = 9,10-9 = 1,所以 校驗位是1
DBS Compass VISA 4518-3545-2695-4001
單數位置︰0, 4, 9, 2, 4, 3, 1, 4
雙數位置︰0, 5, 6, 5, 5, 8, 5
單數位置x2 =︰0, 8, 18, 4, 8, 6, 2, 8
如積(乘2後的結果)是雙位數,將個位與十位加總:0, 8, 9, 4, 8, 6, 2, 8
全部相加:
將個位與十位加總:0, 8, 9, 4, 8, 6, 2, 8
雙數位置︰0, 5, 6, 5, 5, 8, 5
= 79
79 mod 10 = 9,10-9 = 1,所以 校驗位是1
後記
難怪有些系統很快便知道輸入錯 VISA / MASTER,雖然最終到了支付API 也會知道是錯。
但client side已經知道錯,可報錯給user,不給去下一步支付,變相令回饋更順更快
Reference
銀行閑閑談 #276 — 在天津遇上百年滙豐
八達通最後括號入面個數係咪有得計?
No comments:
Post a Comment