GB11643-1999 是我國現行公民身份證號的國家標準。我們可以很容易地找到這一文件。
身份#
身份證號即公民身份號碼,由 18 位號碼組成。身份證號碼分為兩部分,本體碼和校驗碼。
本體碼#
身份證號的前十七為本體碼(master number),排列順序從左至右依次為:六位數字地址碼,八位數字出生日期碼,三位數字順序碼。這一部分較為簡單,我不再贅述。
校驗碼#
身份證號的第十八位為校驗碼(check number),可由前十七位通過規定的數學關係式運算得到。具體採用 MOD 11-2 校驗碼算法。
MOD 11-2 校驗#
首先身份證號碼的每一位都有其固定的加權因子 $Wi$,它等於 $2$ 的 $18-i$ 次方除以 $11$ 的餘數,$i$ 為各個號碼的位數,即:
將前十七位號碼 $a_i$ 與其對應的加權因子 $W_i$ 相乘再相加,可以得到數值 $S$:
求出 $S$ 除以 $11$ 的餘數:
再用 $12$ 減去這個餘數:
最後計算出該差除以 $11$ 的餘數,就得到了最終的校驗碼 $a_{18}$:
好了,我們已經知道了算法,讓我們試試吧(此處以上面提到的國家標準裡的附錄 A 為例):
一公民的身份證號碼為 11010519491231002X
我們可以求出前十七位各自的加權因子
首先舉個栗子,我們求出第 5 位的加權因子 $W_5$:
$W_5$ 就應等於 8192 除以 11 的餘數:
同理,一通計算猛如虎,我們可以輕鬆得出下面這一關於 $W_i$ 與 $a_i$ 關係的表格:
$a_i$ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
$W_i$ | 7 | 9 | 10 | 5 | 8 | 4 | 2 | 1 | 6 | 3 | 7 | 9 | 10 | 5 | 8 | 4 | 2 |
然後求出數值 $S$:
用 167 除以 11 商 15 餘 2 :
12 減去 2 的差為 10 ,10 除以 11 商 0 餘 10 :
因此校驗碼 $a_{18}$ 等於 10 ,又身份證號碼限定為 18 位,故 10 用羅馬數字 X 代替,此公民的身份證號碼校驗碼為 X 。
注:本文參考以下資料:
- 中華人民共和國國家標準《 GB 11643-1999 公民身份號碼》
- 維基文庫《 GB 11643-1999 公民身份號碼》
咳咳#
第一次體驗 LaTeX ,感覺不錯,很容易上手。