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

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

中华人民共和国公民身份号码由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位身份证号是否有误。这也是一些网站初步验证身份证号的机制。

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