posts - 33,  comments - 17,  trackbacks - 0
现在的居民身份证由原先的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校验码计算出来的检验码。

下面介绍算法。
先引入公式:
uploads/200709/21_204230_1.jpg
uploads/200709/21_204643_1.jpg


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


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

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

又如:某男性公民身份证号码的本体码为34052419800101001
uploads/200709/21_213847_1.jpg
Y = mod(S, 11)=MOD(189,11)=2
查表得该人员身份证号码为:34052419800101001X

具体实现代码如下(JAVA):
 1public boolean isIdCard(String arrIdCard) {
 2        int sigma = 0;
 3        Integer[] a = {7910584216379105842};
 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    }

posted on 2008-05-28 19:48 scea2009 阅读(25003) 评论(10)  编辑  收藏

FeedBack:
# re: 18位号码身份证校验码的计算公式
2011-07-24 11:06 | call mepro
320105198209275127 成年了?
  回复  更多评论
  
# re: 18位号码身份证校验码的计算公式
2011-08-12 16:47 | 阿斯顿撒
@call mepro
都40岁了好么  回复  更多评论
  
# re: 18位号码身份证校验码的计算公式
2011-08-31 20:52 | 谭芳香
还好  回复  更多评论
  
# ISO 7064:1983.MOD 11-2
2012-10-02 09:33 | 张策




  回复  更多评论
  
# re: 18位号码身份证校验码的计算公式
2013-05-04 02:10 | 邱丽娟
35078419861128420  回复  更多评论
  
# re: 18位号码身份证校验码的计算公式
2013-05-04 02:11 | 邱丽娟
邱丽娟  回复  更多评论
  
# re: 18位号码身份证校验码的计算公式
2013-05-04 02:12 | 邱丽娟
1public 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 }
  回复  更多评论
  
# re: 18位号码身份证校验码的计算公式
2013-06-15 15:28 | lixziyu
wozhidao  回复  更多评论
  
# re: 18位号码身份证校验码的计算公式
2013-07-30 12:14 | 陆树军
340621198706139338  回复  更多评论
  
# re: 18位号码身份证校验码的计算公式[未登录]
2014-01-08 23:17 | 李杰
1@邱丽娟
  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航:
 

<2008年5月>
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567

常用链接

留言簿(1)

随笔分类

随笔档案

PL/SQL存储过程与函数

搜索

  •  

最新评论

阅读排行榜

评论排行榜