转贴:用PHP计算身份证校验码

转载 2004年11月03日 13:58:00
http://www.lmws.net/phpweb/article.php?id=79

用PHP计算身份证校验码
  中国(大陆)公民身份证号码每一位所代表的意义,网上很多文章都有介绍,在此就不多说。其中身份证号码的最后一位是校验码,跟据前17位计算得到。算法大概是这样:把前17位的每一个数字和一串加权因子相乘,再计算这些乘积的和;把这些乘积的和模11得到的数字作为序号,最后在一个校验码串中提取出与序号相对应的字符。当然,网上也有不少的文章教大家计算这个校验码,下面我们将尝试用PHP语言来完成这一工作,也许可以用于PHP开发中,如校验用户的身份证号码是否正确。

  假设某中国(大陆)公民的身份证号码前17位是这个:44010221990101001(注:此人出生于2199年),那么我们跟据上面的算法尝试写几行PHP代码来完成校验码的计算。为了能让大家更容易理解,我使用了较简单的语句,请看代码:


<?php
//身份证号码前17位,可以从各种数据源中获得(如数据库、用户提交的表单等)
$body  = '44010221990101001';

//加权因子
$wi = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);

//校验码串
$ai = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');

//按顺序循环处理前17位
for ($i = 0;$i < 17;$i++) {
    
//提取前17位的其中一位,并将变量类型转为实数
    
$b = (int) $body{$i};

    
//提取相应的加权因子
    
$w = $wi[$i];

    
//把从身份证号码中提取的一位数字和加权因子相乘,并累加
    
$sigma += $b * $w;
}

//计算序号
$number = $sigma % 11;

//按照序号从校验码串中提取相应的字符。
$check_number = $ai[$number];

//输出
echo $body.$check_number;
?>


  运行以上代码之后,可以算出该身份证的校验码为9。大家可以用自己身份证的前17位试试。

  如果你明白上面的例子的话,就可以把这段代码的一些语句合并,去除没必要的变量,优化得到如下代码:


<?php
$body  
= '44010221990101001';
$wi = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
$ai = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
for (
$i = 0;$i < 17;$i++) {
    
$sigma += ((int) $body{$i}) * $wi[$i];
}
echo
$body.$ai[($sigma % 11)];
?>


  大致思路就是这样,实现的方法是有很多。如果你编写了更优的方法,欢迎指教。


 

身份证校验码算法(一)

身份证校验码产生方法:∑(ai×Wi)(mod 11)i: 表示号码字符从由至左包括校验码在内的位置序号;ai 表示第i位置上的号码字符值;Wi 第i位置上的加权因子,其数值Wi=mod(power(...
  • inrgs
  • inrgs
  • 2007年02月18日 23:00
  • 4681

用Python计算身份证校验码

转自:http://my.oschina.net/moooofly/blog/147958 原来的天朝良民证是15位,构成如下:  1~6位:地址码。采用的是行政区划代码,可以去 统计局的网站 查...
  • shanliangliuxing
  • shanliangliuxing
  • 2013年08月27日 18:01
  • 937

中国大陆18位身份证校验算法(附JS实现)

大陆18位身份证(第二代身份证)结构:(如下图所示)身份号码是一组具有特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地区码,八位数字生日码,三位数字顺序码和一位数字校...
  • wolfcyl
  • wolfcyl
  • 2011年05月20日 23:15
  • 12892

身份证的校验码计算

PS:倒数第二位奇数为男,偶数为女 (1)十七位数字本体码加权求和公式  S = Sum(Ai * Wi), i = 0, … , 16 ,先对前17位数字的权求和  Ai:表示第i...
  • samtaoys
  • samtaoys
  • 2017年09月21日 13:21
  • 137

用SQL写的18位身份证校验代码

身份证校验码的计算方法  1、将前面的身份证号码17位数分别乘以不同的系数。第i位对应的数为[2^(18-i)]mod11。从第一位到第十七位的系数分别为:7 9 10 5 8 4 2 1 6 3 7...
  • shengguocun
  • shengguocun
  • 2014年03月20日 22:39
  • 1169

二代身份证编码规则及校验代码实现

本文主要讨论的是二代身份证编码规则及其Java代码实现,下面的校验方式还不是特别严谨,由于只校验了前两位的省份信息,中间六位的出生日期信息和最后一位的校验码信息,故对于部分不满足要求的证件号码刚好同时...
  • embracejava
  • embracejava
  • 2017年08月17日 21:51
  • 909

18位身份证号码验证算法代码

介绍18位身份证号码最后一位校验码的计算方法公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。校...
  • iiprogram
  • iiprogram
  • 2007年09月18日 13:17
  • 3515

18位号码身份证校验码的计算公式

现在的居民身份证由原先的15位号码升级为18位了。从左至右,第1-2位为省级行政区划代码,第3-4为为地级行政区划代码,第5-6位为县级行政区划代码,第7-10位为出生年份,第11-12位为出生月份,...
  • isadream
  • isadream
  • 2009年05月13日 10:31
  • 3608

检验身份证号码真伪算法

import java.util.Scanner;/*检验身份证号码真伪算法:17位加权因子:7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 检...
  • sz457763638
  • sz457763638
  • 2015年03月23日 11:11
  • 346

查验身份证

5-8 查验身份证 (15分)一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下:首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2,1...
  • yyxiangyu
  • yyxiangyu
  • 2017年02月21日 19:53
  • 1034
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:转贴:用PHP计算身份证校验码
举报原因:
原因补充:

(最多只允许输入30个字)