“中华人民共和国公民身份号码” 验证算法
“中华人民共和国公民身份号码” 验证算法
中华人民共和国公民身份号码由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位身份证号是否有误。这也是一些网站初步验证身份证号的机制。
附上本人所写的一个提取身份号码有关信息的小工具——“中华人民共和国公民身份号码”验证工具