首先我们看下身份证的组成(这里只说明18位)
身份证是由: 地址码(前六位数)、出生日期码(第七位至十四位)、顺序码(第十五位至十七位)、校验码(第十八位数) 组成
地址码(前六位数)
表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按GB/T2260的规定执行。
出生日期码(第七位至十四位)
表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日代码之间不用分隔符。
顺序码(第十五位至十七位)
表示在同一地址码所标识的区域范围,对同年、同月、同日出生的人编定的顺序号,顺序码奇数分配给男性,偶数分配给女性。
校验码(第十八位数)
根据国家标准GB 11643-1999
这里如何计算校验码是关键
-
先对前17位数字的权求和
加权因子一共17位 [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
加权求和公式:
S=(身份证上第1位*加权因子第1位)+...+(身份证上第17位*加权因子第17位)
-
计算模
M=mod(S, 11)
-
通过模得到对应的校验码
校验码数组: ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']
M是对应校验码的数组索引 如:M=1 则校验码为0
下面是具体的计算方法
$cardid='你的身份证号码'
// 只能是18位
if(strlen($cardid)!=18){
return false;
}
// 取出前17位
$idcard_base = substr($cardid, 0, 17);
// 取出校验码
$verifycode = substr($cardid, 17, 1);
// 加权因子
$factor = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
// 校验码对应值
$verify_code_arr = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
// 根据前17位计算校验码
$S= 0;
for($i=0; $i<17; $i++){
$S += substr($idcard_base, $i, 1)*$factor[$i];
}
// 取模
$mod = $S% 11;
// 比较校验码
if($verifycode == $verify_code_arr[$mod]){
echo '身份证号码正确';
}else{
echo '身份证号码错误';
}
- 我的微信
- 这是我的微信扫一扫
-
- 我的微信公众号
- 我的微信公众号扫一扫
-