18位身份证校验

原文:http://www.blogjava.net/vlinDone/archive/2008/05/28/203623.html

        现在的居民身份证由原先的15位号码升级为18位了。从左至右,第1-2位为省级行政区划代码,第3-4为为地级行政区划代码,第5-6位为县级行政区划 代码,第7-10位为出生年份,第11-12位为出生月份,第13-14为出生日期,第15-17位为顺序码,表示在同一地址码所标识的区域范围内,对同 年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性,第18位为作为尾号的校验码,是由号码编制单位按统一的公式计算出来的, 如果某人的尾号是0-9,都不会出现X,但如果尾号是10,那么就得用X来代替,因为如果用10做尾号,那么此人的身份证就变成了19位。X是罗马数字的 10,用X来代替10,可以保证公民的身份证符合国家标准。

根据《中华人民共和国国家标准GB 11643-1999》中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。排列顺序从左至右依次为:六位数 字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。顺序码的奇数分给男性,偶数分给女性。校验码是根据前面十七位数字码,按照ISO 7064:1983.MOD 11-2 校验码计算出来的检验码。

下面介绍算法。
先引入公式:



计算公式令结果为 Y ,Y的计算公式为:
Y = mod(S, 11) 根据下表找出 Y 对应的校验码即为要求身份证号码的校验码C。



例如:假设某女性居民的15位身份证号码是320105820927512,32表示江苏省,01表示南京市,05表示鼓楼区,820927表示1982 年9月27日。512表示是该地区同年同月同日的第512人,其中2表示是女性。那么,升级为18位后的号码为32010519820927512C。下 面就根据公式来计算C的值。


Y = mod(S, 11)=MOD(313,11)=5
根据校验值对应表,可知C=7,该人员身份证号码为:320105198209275127

又如:某男性公民身份证号码的本体码为34052419800101001

Y = mod(S, 11)=MOD(189,11)=2
查表得该人员身份证号码为:34052419800101001X
具体实现代码如下(JAVA):

 1 public   boolean  isIdCard(String arrIdCard)  {
 2          int  sigma  =   0 ;
 3         Integer[] a  =   { 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 } ;
 4         String[] w  =   { " 1 " " 0 " " X " " 9 " " 8 " " 7 " " 6 " " 5 " " 4 " " 3 " " 2 " } ;
 5          for  ( int  i = 0 ; i < 17 ; i ++ {
 6              int  ai  =  Integer.parseInt(arrIdCard.substring(i,i + 1 ));
 7              int  wi  =  a[i];
 8             sigma  +=  ai  *  wi;
 9         }

10          int  number  =  sigma  %   11 ;
11         String check_number  =  w[number];
12          // return check_number;
13          // System.out.println(check_number);
14          if  ( ! arrIdCard.substring( 17 ).equals(check_number))  {
15              return   false ;
16         }
  else   {
17              return   true ;
18         }

19     }

你可能感兴趣的:(C++,c,算法,.net,C#)