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

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。