首页 编程编程其他身份证号码结构分析

身份证号码结构分析

  最近打算做一个关于身份证号码查询的API,因此在网路上查了一些关于身份证号码相关的知识。根据对GB11643-1989的解读,身份证号码的前身是“社会保障号码”,国家质量技术监督局于1999年7月1日实施的GB11643-1999《公民身份号码》是GB11643-1989《社会保障号码》的修订版,其中指出将原标准名称“社会保障号码”更名为“公民身份号码”,另外GB11643-1999《公民身份号码》从实施之日起代替GB11643-1989。

e4dde71190ef76c69b0f819d9d16fdfaae5167a2

身份证号码组成:

  按照 GB11643—1999《公民身份证号码》国家标准,完整的身份号码由18位数字组成:前6位为行政区划分代码,第7位至14位为出生日期码,第15位至17位为顺序码(奇数分配给男性,偶数分配给女性),第18位为校验码(由前17位号码计算得出)。

 

15位身份证号码与18位身份证号码:

  在2000年以前办的一代身份证多为15位数字码,其年份采用两位数编码,如出生日期“19610326”在原来标准中表示为“610326”,再去掉末位的校验码,正好是15位。新标准实施以后,原7、8位的年份号攺为全称,如1961年过去7、8位码是61,现在增改为1961,并在最后一位增设校验码,如后三位原来421,加一个5成为4215。身份号码一经编定不作改变,更换新证件时派出所会更新为18位的新码。目前,这一政策实施十几年过去了,我的一代身份证拿到手就是18位号码,而我的父母辈以前是15位号码。说到这里我想到一个问题:旧标准如果是1900年以前出生的人怎么编定呢?因为1895年出生的人和1995年出生的人在身份号码上并没有体现,关于这一点,元方你怎么看?

 

什么是顺序码?

  身份证号码的第15、16、17位为顺序码,用以区分一个行政区内同一天出生的人,从000-999,理论上可以容纳1000个号码(男女各500人,奇数分配给男性、偶数分配给女性)。如果1000个号码真的不够用了,还可以从前面的6位地区码中扩展。

 

计算校验码:

  校验码是根据前面十七位数字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的,算法如下:

  1. 将身份证号码前17位数分别乘以不同的系数,从第1位到第17位的系数分别为:7、9、10、5、8、4、2、1、6、3、7、9、10、5、8、4、2

  2. 将得到的17个乘积相加。

  3. 将相加后的和除以11并得到余数。

  4. 余数只有可能为0、1、2、3、4、5、6、7、8、9、10这些个数字,其对应的身份证最后一位校验码为1、0、X、9、8、7、6、5、4、3、2。(这里为了不改变号码的18位长度,把校验码10用罗马数字X代替)

  5.通过上面的对应关系得知如果余数是2,就会在身份证的第18位数字上出现罗马数字的Ⅹ。如果余数是10,身份证的最后一位号码就是2。

 

用程序检验身份证号码:

  有了上面的算法,我们可以编写程序来检验身份证号码的合法性,结合行政区域编码数据,还可以做一个简单的身份证信息查询功能。下面提供一个我用VBScript编写的身份校验码验证函数以供参考:

 

‘*******************************************************
‘  函数名称:CheckCode
‘  目    的:检查/补齐身份证号码的校验位
‘  输    入:15位,17位,18位
‘  返    回:0-9 X
‘*******************************************************
Function CheckCode(strNum)

Dim sID
Dim nSum
Dim strCheck

If Len(strNum)=15 Then
sID=Left(strNum,6) & “19” & Right(strNum,9)
ElseIf Len(strNum)=17 Or Len(strNum)=18 Then
sID=Left(strNum,17)
End If

nSum=Left(sID,1) * 7
nSum=nSum+Mid(sID,2,1) * 9
nSum=nSum+Mid(sID,3,1) * 10
nSum=nSum+Mid(sID,4,1) * 5
nSum=nSum+Mid(sID,5,1) * 8
nSum=nSum+Mid(sID,6,1) * 4
nSum=nSum+Mid(sID,7,1) * 2
nSum=nSum+Mid(sID,8,1) * 1
nSum=nSum+Mid(sID,9,1) * 6
nSum=nSum+Mid(sID,10,1) * 3
nSum=nSum+Mid(sID,11,1) * 7
nSum=nSum+Mid(sID,12,1) * 9
nSum=nSum+Mid(sID,13,1) * 10
nSum=nSum+Mid(sID,14,1) * 5
nSum=nSum+Mid(sID,15,1) * 8
nSum=nSum+Mid(sID,16,1) * 4
nSum=nSum+Mid(sID,17,1) * 2

strCheck=12-nSum Mod 11
If strCheck=12 Then
strCheck=1
ElseIf strCheck=11 Then
strCheck=0
ElseIf strCheck=10 Then
strCheck=”X”
End If

CheckCode=strCheck

End Function