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 ,感觉不错,很容易上手。