lazyload the images

最新精選 Featured post

異世界穿越作品整合

訂閱

訂閱 FB 專頁

每月雙數周日為固定發佈日

訂閱FB 專頁,有新發佈時將會立即看見。
Youtube 頻道經常會有電玩錄影

16/12/2025

Octopus check digit, Luhn algorithm

文章分類:

 



前言


上次說了 HKID Check Digit

今說 Octopus 八達通

它等於是 日本的西瓜卡、台灣的悠遊卡

原來八達通的check digit 也有 驗證公式 流出,海豚現在才知道


Octopus 八達通 Check Digit


使用類似 Luhn algorithm (盧恩算法)

  1. 將八達通 7~9 個號碼,不包括括號內數字。從右往左,單數位置乘1,雙數位置乘2,如果乘出來的結果是雙位數,則將個位數與十位數相加。
  2. 把全得數未全部加在一起
  3. 將結果 mod 10,即除10,取餘數,以10減去餘數,便是校驗位。如能整除沒有餘數,即校驗位為 0

海豚為驗證,買了兩張八達通



102012507 (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