第二代身份证号码共18位,由17位本体码和1位校验码组成。其中,本体码前6位是地址码,表示登记户口时所在地的行政区划代码,依照《中华人民共和国行政区划代码》国家标准(gb/t2260)的规定执行;接下来的8位是出生年月日,采用yyyymmdd格式;本体码的最后三位是顺序码,表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编订的顺序号,顺序码的奇数分配给男性,偶数分配给女性,即第17位奇数表示男性,偶数表示女性;
第二代身份证号码的第18位是校验码,采用iso 7064:1983, mod 11-2校验字符系统。校验码取值为模11的余数,如果为10,则用x代替,因此可用一个字符表示。
第一代身份证和第二代身份证的区别在于:
1. 第一代身份证是15位,而第二代身份证是18位;
2. 第一代身份证出生年月日采用yymmdd格式,而第二代身份证出生年月日采用yyyymmdd格式;
3. 第一代身份证没有校验码。
设身份证号码为一字符串 a=[a0, ..., a17], 对应地,定义权重w=[w0, ..., w17] ,wi = 218-i mod 11,则校验公式为:
# 输入身份证字符串a
def idchecker(a):
... # 判断a的位数是否为18
... if len(a) != 18:
... ... return false
if a[17] == 'x' or a[17] == 'x' :
... ... s = 10
else
... ... s = int(a[17] )
... w = 2
... for i in range(len(a)-2,0,-1):
... ... s = int(p[i) * (w)
... ... w *= 2
... return s == 1
.