身份证规则 (转http://blog.163.com/tonylee@126/blog/static/130335554201001841014742/)

Coordinator
May 11, 2012 at 2:56 AM

  

2010-01-18 16:10:14|  分类: JAVA |  标签:  |字号  订阅

身份证号码编码方法
要进行身份证号码的验证,首先要了解身份证号码的编码规则。我国身份证号码多由若干位数字或者数字与字母混合组成。早期身份证由15位数字构成,这主要是在1980年以前发放的身份证,后来考虑到千年虫问题,因为15位的身份证号码只能为190011日到19991231日出生的人编号,所以又增加了18位身份证号码编号规则。

15
位身份证号码编码较为简单,从左到右其15位码依次为:

1     2     3     4     5     6     7     8     9     10   11   12   13   14   15

A     A     A     A     A     A     Y     Y     M    M    D     D     N    N    S

前六位AAAAAA是身份证编码对象的所在地(出生地)的编码,该号码可由国家统计局公布的相关标准中得到。YY表示出生年的后两位,MMDD表示出生月和日,不足两位的高位补0NNS为顺序号,无法确定。S为性别识别码,男性为奇数,女性为偶数。例如,一位于1965216日出生在湖北省巴东县的女性的15位身份证号码为:

1     2     3     4     5     6     7     8     9     10   11   12   13   14   15

A     A     A     A     A     A     Y     Y     M    M    D     D     N    N    S

4     2     2     8     2     3     6     5     0     2     1     6     0     2     2

18
位身份证号码比15位身份证号码多出的3位中的两位用来补充2位的年份为4位,另外1位作为校验码存在。一项由国家质量技术监督局发布的标准对身份证号码的编码规则做了具体的规定。该标准为名《公民身份号码》,编号GB11643-1999,为国家强制标准。它代替了1989年公布的名为《社会保障号码》GB11643-1989国家强制标准,从199971日开始强制实施。该标准的内容介绍如下。

1
.标准适用范围:规定了公民身份号码的编码对象、号码的具体结构组成和表现形式,并规定每个编码对象将获得一个唯一的、终身不变的号码。

2
.编码对象:具有中国人民共和国国籍的公民。

3
.号码的结构组成和表现形式。

该标准中对号码的构造组成和表现形式进行了如下的阐述:

号码由17位本体码和1位校验码组成,这18位号码从左到右依次为:

1     2     3     4     5     6     7     8     9     10   11   12   13   14   15   16   17   18

A     A     A     A     A     A     Y     Y     Y     Y     M    M    D     D     N    N    S     C

前六位AAAAAA同样是地区编码,按照国家推荐标准GB/T2260的规定进行编码。YYYY是扩充后的四位出生年码,MMDD为出生月和日码,不足两位的仍然在高位补0NNS为无法确定的顺序码,其中S为性别识别码,同样将奇数分配给男性,偶数分配给女性。第18位校验位是对前17位进行如下的计算得到的。

使用数组B[I]表示从左到右第I个数字,W[I]表示第I位上的加权因子,需要注意的是,为了方便讲述,这里的数组第一个是B[1]而不是计算机中的B[0]W[I]也是同样。加权因子依次为:

1     2     3     4     5     6     7     8     9     10   11   12   13   14   15   16   17

7     9     10   5     8     4     2     1     6     3     7     9     10   5     8     4     2

得到第18位的值C首先要利用这个加权因子计算出 的值, 的计算公式为:


即,将前17位的数字与其对应的加权因子相乘,再将积相加,最后的和再除以11,取其余。除以11最后的余有11种可能,从010。通过余再做一个转换,即可得到相应的第18位上的校验码,余数和校验码的转换如下:

余数                     0     1     2     3     4     5     6     7     8     9     10

对应的校验码       1     0     X     9     8     7     6     5     4     3     2

下面我们来计算一下一位湖北省襄樊市襄城区在1986119日出生的男性的18位身份证号码,其顺序号假定为321(男性为奇数)。该身份证号前17位为:

4     2     0     6     8     2     1     9     8     6     1     1     0     9     3     2     1

先计算前17位与加权因子的积的和除以11的余:



余数为1则其对应的第18位校验码为0,该男性的18位身份证号码为:

4     2     0     6     8     2     1     9     8     6     1     1     0     9     3     2     1     0

校验码可以作为一种判断一个正确的身份证号的前17位是否有错误发生的标准,但这并不一定在任何情况下都是有效的,在某些情况下的错误也是这个校验位无法检测的,比如,多个数字发生错误,例如,当上例中的身份证号码由42068219861109321变为42098219861106321后,其校验码仍为0

 

 

另一个版本,这个难懂点,但要参照

中华人民共和国身份证验证规则 

现将“18位身份证标准提供如下:
  18
位身份证标准在国家质量技术监督局于199971日实施的GB11643-1999《公民身份号码》中做了明确的规定。
  GB11643-1999
《公民身份号码》为GB11643-1989《社会保障号码》的修订版,其中指出将原标准名称社会保障号码更名为公民身份号码,另外GB11643-1999《公民身份号码》从实施之日起代替GB11643-1989
  GB11643-1999
《公民身份号码》主要内容如下:
  
一、范围
  
该标准规定了公民身份号码的编码对象、号码的结构和表现形式,使每个编码对象获得一个唯一的、不变的法定号码。
  
二、编码对象
  
公民身份号码的编码对象是具有中华人民共和国国籍的公民。
  
三、号码的结构和表示形式
  1
、号码的结构
  
公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数
字出生日期码,三位数字顺序码和一位数字校验码。
  2
、地址码
  
表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按GB/T2260的规定执行。
  3
、出生日期码
  
表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日代码之间不用分隔符。
  4
、顺序码
  
表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配
给女性。
  5
、校验码
  (1)
十七位数字本体码加权求和公式
  S = Ai * Wi, i = 2, ... , 18
  Y = mod(S, 11)
  i:
表示号码字符从右至左包括校验码字符在内的位置序号
  Ai:
表示第i位置上的身份证号码字符值
  Wi:
表示第i位置上的加权因子
  i: 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
  Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 1
  (2)
校验码字符值的计算
  Y:   0 1 2 3 4 5 6 7 8 9 10
  
校验码: 1 0 X 9 8 7 6 5 4 3 2
  
四、举例如下:
  
北京市朝阳区: 11010519491231002X
  
广东省汕头市: 440524188001010014


15
位的身份证号
dddddd yymmdd xx p
18
位的身份证号
dddddd yyyymmdd xx p y
其中dddddd为地址码(省地县三级)18位中的和15位中的不完全相同
yyyymmdd yymmdd
为出生年月日
xx
顺号类编码
p
性别
18
位中末尾的y为校验码,在网上可以找到算法
将前17位的ascii码值经位移、异或运算结果不在0-9的令其为x