barkure

barkure

telegram
github

身份證中的MOD 11-2校驗

GB11643-1999 是我國現行公民身份證號的國家標準。我們可以很容易地找到這一文件。


身份#

身份證號即公民身份號碼,由 18 位號碼組成。身份證號碼分為兩部分,本體碼和校驗碼。

本體碼#

身份證號的前十七為本體碼(master number),排列順序從左至右依次為:六位數字地址碼,八位數字出生日期碼,三位數字順序碼。這一部分較為簡單,我不再贅述。

校驗碼#

身份證號的第十八位為校驗碼(check number),可由前十七位通過規定的數學關係式運算得到。具體採用 MOD 11-2 校驗碼算法。

MOD 11-2 校驗#

首先身份證號碼的每一位都有其固定的加權因子 $Wi$,它等於 $2$ 的 $18-i$ 次方除以 $11$ 的餘數,$i$ 為各個號碼的位數,即:

Wi=218i(mod11)W_i = 2^{18-i}\pmod {11}

將前十七位號碼 $a_i$ 與其對應的加權因子 $W_i$ 相乘再相加,可以得到數值 $S$:

S=i=117Wi×aiS = \sum_{i=1}^{17}W_i×a_i

求出 $S$ 除以 $11$ 的餘數:

S(mod11)S\pmod{11}

再用 $12$ 減去這個餘數:

12S(mod11)12-S\pmod{11}

最後計算出該差除以 $11$ 的餘數,就得到了最終的校驗碼 $a_{18}$:

a18=(12S(mod11))(mod11)a_{18} = (12-S\pmod{11})\pmod{11}

好了,我們已經知道了算法,讓我們試試吧(此處以上面提到的國家標準裡的附錄 A 為例):

一公民的身份證號碼為 11010519491231002X

我們可以求出前十七位各自的加權因子

首先舉個栗子,我們求出第 5 位的加權因子 $W_5$:

2185=213=81922^{18-5} = 2^{13} = 8192

$W_5$ 就應等於 8192 除以 11 的餘數:

W5=8192(mod11)=8W_5 = 8192\pmod{11} = 8

同理,一通計算猛如虎,我們可以輕鬆得出下面這一關於 $W_i$ 與 $a_i$ 關係的表格:

$a_i$1234567891011121314151617
$W_i$7910584216379105842

然後求出數值 $S$:

S=i=117Wi×ai=71+91+100+51+80+45+21+19+64+39+71+92+103+51+80+40+22=167S = \sum_{i=1}^{17}W_i×a_i = 7*1+9*1+10*0+5*1+8*0+4*5+2*1+1*9+6*4+3*9+7*1+9*2+10*3+5*1+8*0+4*0+2*2 = 167

用 167 除以 11 商 15 餘 2 :

167(mod11)=2167\pmod{11} = 2

12 減去 2 的差為 10 ,10 除以 11 商 0 餘 10 :

(122)(mod11)=10(12-2)\pmod{11} = 10

因此校驗碼 $a_{18}$ 等於 10 ,又身份證號碼限定為 18 位,故 10 用羅馬數字 X 代替,此公民的身份證號碼校驗碼為 X 。


注:本文參考以下資料:


咳咳#

第一次體驗 LaTeX ,感覺不錯,很容易上手。

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。