Chinaunix首页 | 论坛 | 博客
  • 博客访问: 868009
  • 博文数量: 66
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 2071
  • 用 户 组: 普通用户
  • 注册时间: 2012-12-04 15:22
个人简介

从事IT相关工作近10年,获得《网络规划师》《信息系统项目管理师》《系统分析师》、Cisco等认证,对网络和操作系统有较深理解,对认证计费系统和虚拟化技术有深入研究。

文章分类

全部博文(66)

文章存档

2019年(4)

2018年(1)

2015年(2)

2014年(16)

2013年(43)

分类: PHP

2013-10-09 17:52:41

关于身份证的校验算法问题
身份证15位升级到18位,原来年用2位且没有最后一位,从左到右方分别表示
①1-2 升级行政区代码
②3-4 地级行政区划分代码
③5-6 县区行政区分代码
④7-10 11-12 13-14 出生年、月、日
⑤15-17 顺序码,同一地区同年、同月、同日出生人的编号,奇数是男性,偶数是女性
⑥18 校验码,如果是0-9则用0-9表示,如果是10则用X(罗马数字10)表示
 
ISO 7064:1983.MOD 11-2校验码
  ∑(a[i]*W[i]) mod 11 ( i = 18,17,16 ... 2 ) 最后一位是校验位 1 
 
  "*" 表示乘号
  i--------表示身份证号码每一位的序号,从右至左,最左侧为18,最右侧为1
  a[i]-----表示身份证号码第 i 位上的号码
  W[i]-----表示第 i 位上的权值 W[i] = 2^(i-1) mod 11  【这里得到的序列是 7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2】
  计算公式 (1) 令结果为 R
 
  根据下表找出 R 对应的校验码即为要求身份证号码的校验码C。
  R 0 1 2 3 4 5 6 7 8 9 10
  C 1 0 X 9 8 7 6 5 4 3 2
  由此看出 X 就是 10,罗马数字中的 10 就是 X

1、将前面的身份证号码17位数分别乘以不同的系数。第i位对应的数为[2^(18-i)]mod11。从第一位到第十七位的系数分别为: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这11个数字。其分别对应的最后一位身份证的号码为1 0 X 9 8 7 6 5 4 3 2;
5、通过上面得知如果余数是2,就会在身份证的第18位数字上出现罗马数字的Ⅹ。如果余数是10,身份证的最后一位号码就是2;

下面是我自己写的一个简单的PHP实现的过程:

  1. <?php


  2. /**
  3. * 输入 id 号码 然后检验是否合适
  4. **/


  5. function checkId($id) {


  6.     $len = strlen($id);
  7.     if($len != 18) {
  8.         return 0;
  9.     }


  10.     $a=str_split($id,1);
  11.     $w=array(7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2);


  12.     $c=array(1,0,'X',9,8,7,6,5,4,3,2);


  13.     $sum = 0;
  14.     for($i=0;$i<17;$i++){
  15.             $sum= $sum + $a[$i]*$w[$i];
  16.     }
  17.     $r=$sum%11;
  18.     $res=$c[$r];
  19.     //echo "校验位是: ".$res;
  20.     if ($res == $a[17]) {
  21.         return 1;
  22.     } else {
  23.         return 0;
  24.     }


  25. }
使用Excel进行校验计算的模型,假设号码在A1单元格的内部,则在计算栏里面输入如下的公式即可计算:


  1. =LOOKUP(MOD(MID($A$1,1,1)*MOD(2^17,11)+MID($A$1,2,1)*MOD(2^16,11)+MID($A$1,3,1)*MOD(2^15,11)+MID($A$1,4,1)*MOD(2^14,11)+MID($A$1,5,1)*MOD(2^13,11)+MID($A$1,6,1)*MOD(2^12,11)+MID($A$1,7,1)*MOD(2^11,11)+MID($A$1,8,1)*MOD(2^10,11)+MID($A$1,9,1)*MOD(2^9,11)+MID($A$1,10,1)*MOD(2^8,11)+MID($A$1,11,1)*MOD(2^7,11)+MID($A$1,12,1)*MOD(2^6,11)+MID($A$1,13,1)*MOD(2^5,11)+MID($A$1,14,1)*MOD(2^4,11)+MID($A$1,15,1)*MOD(2^3,11)+MID($A$1,16,1)*MOD(2^2,11)+MID($A$1,17,1)*MOD(2^1,11),11),{0;1;2;3;4;5;6;7;8;9;10},{1;0;"X";9;8;7;6;5;4;3;2})
下面这个图则是对身份证进行校验计算的模型:



下面是国家发布的GB文档


阅读(3438) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~