“中华人民共和国公民身份号码” 验证算法

“中华人民共和国公民身份号码” 验证算法

中华人民共和国公民身份号码由18位组成,其中前17位由阿拉伯数字0~9组成,最后一位由0~9或X 构成,按构造顺序如下:

位置 长度 说明
区域码 1~6位 6 指公民常住户口所在地的行政划区代码,由省(2位)+市(2位)+区(县)(2位)构成
出生日期码 7~14位 8 指公民出生的公历日期,由年(4位)+月(2位)+日(2位)构成
顺序码 15、16位 2 表示在同一区域码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号
性别码 17位 1 奇数代表男性,偶数代表女性
校验码 18位 1 通过前17位计算所得,见国标GB11643-1999

根据标准,最后一位校验码采用ISO 7064:1983.MOD 11-2校验码计算法,具体计算方法解释如下,令$N_i (i=1,2…16,17)$表示每一位身份证号,需要首先计算各位的权重$W_i$:
$$ W_i = 2^{17-(i-1)} \mod 11 $$
计算所得权重数据如下表:

位数$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

最后一位校验码 $C$ 由下式计算而出:
$$ C= (12 - (\sum_{i=1}^{17}{(N_i W_i)} \mod 11 ) \mod 11 $$
可以发现,$C$因为最后与$11$求余计算,导致$C$必然小于等于$10$。又因为阿拉伯数字限制,如果$C=10$,则校验码为字符"X";如果$C \leq 10$,则校验码为数字"C"。

我们可以根据计算前17位身份证码所得校验码与所提供的第18位校验码进行是否相等判定,从而得出所输入的18位身份证号是否有误。这也是一些网站初步验证身份证号的机制。

附上本人所写的一个提取身份号码有关信息的小工具——“中华人民共和国公民身份号码”验证工具