身份证号码中的校验码是身份证号码的最后一位,是根据GB 11643-1999中有关公民身份号码的规定,根据精密的计算公式计算出来的。
公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成的十八位号码。
排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码,最后一位是数字校验码。
表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按GB/T2260的规定执行。
表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日代码之间不用分隔符。
表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。
根据前面十七位数字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的检验码。
将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。
将这17位数字和系数相乘的结果相加。
用加出来和除以11,看余数是多少?
余数只可能有0-1-2-3-4-5-6-7-8-9-10这11个数字。其分别对应的最后一位身份证的号码为1-0-X -9-8-7-6-5-4-3-2。
通过上面得知如果余数是3,就会在身份证的第18位数字上出现的是9。如果对应的数字是2,身份证的最后一位号码就是罗马数字x。
例如:某男性的身份证号码为【53010219200508011x】, 我们看看这个身份证是不是合法的身份证。
首先我们得出前17位的乘积和【(57)+(39)+(010)+(15)+(08)+(24)+(12)+(91)+(26)+(03)+(07)+(59)+(010)+(85)+(08)+(14)+(1*2)】是189,然后用189除以11得出的结果是189/11=17----2,也就是说其余数是2。最后通过对应规则就可以知道余数2对应的检验码是X。所以,可以判定这是一个正确的身份证号码。
var_dump(checkIdCard('身份证号'));
/**
* 验证身份证号码
* @param $idCard
*/
function checkIdCard($idCard)
{
if (strlen($idCard) != 18) {
return '不符合二代身份证';
}
$idCard = strtoupper($idCard);//转大写,处理小写X的情况
$co = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];//系数
$cc = [1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2];//校验位
$sum = 0;
for ($i = 0; $i < 17; $i++) {
$sum += $co[$i] * $idCard[$i];
}
$checkCode = $sum % 11;
if ($idCard[17] == $cc[$checkCode]) {
return '校验通过';
} else {
return '校验不通过';
}
}
?>