1. 身份证号码的构成
身份证号码是中国公民的唯一身份标识,它由18位字符组成,前17位是行政区划码和出生日期码,最后一位是校验码。校验码的计算方法可以用于验证身份证号码的合法性。
1.1. 行政区划码
行政区划码是指身份证号码的前六位数字,代表公民所在的省、自治区或直辖市的行政区划代码。这些代码是由国家统计局发布的,每个区域有一个唯一的代码。
1.2. 出生日期码
出生日期码是身份证号码的第七至第十四位数字,用于表示公民的出生日期。它的格式为YYYYMMDD,其中YYYY表示年份,MM表示月份,DD表示日期。
1.3. 校验码
校验码是身份证号码的最后一位字符,用于校验身份证号码的合法性。它的计算方法是基于ISO 7064的模11-2校验码计算方法。
2. 身份证号码合法性校验算法
为了验证身份证号码是否合法,我们可以使用以下PHP函数来实现:
/**
* 校验身份证号码的合法性
* @param string $idCard 身份证号码
* @return bool 是否合法
*/
function validateIdCard($idCard) {
if (strlen($idCard) != 18) {
return false;
}
$factor = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
$checkCode = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
$sum = 0;
for ($i = 0; $i < 17; $i++) {
$sum += intval($idCard[$i]) * $factor[$i];
}
$mod = $sum % 11;
$checkDigit = $checkCode[$mod];
return $checkDigit === $idCard[17];
}
2.1. 代码解析
上述代码中,我们首先检查身份证号码的长度是否为18位,如果不是,则认为身份证号码不合法。
然后,我们定义了一个因子数组$factor
和一个校验码数组$checkCode
,用于计算校验码。其中$factor
数组中的每个元素分别乘以身份证号码的前17位数字,并求和。最后,将求和结果除以11取模得到校验码的索引,再根据校验码数组$checkCode
和身份证号码的第18位字符进行比较,判断校验码是否匹配。
2.2. 测试样例
我们可以通过一些测试样例来验证该函数的正确性:
// 合法的身份证号码
$idCard1 = '320124198808088888';
$result1 = validateIdCard($idCard1);
echo "身份证号码 $idCard1 是否合法:".($result1 ? '是' : '否')."\n";
// 不合法的身份证号码
$idCard2 = '12345678901234567';
$result2 = validateIdCard($idCard2);
echo "身份证号码 $idCard2 是否合法:".($result2 ? '是' : '否')."\n";
上述代码中,我们用一个合法的身份证号码和一个不合法的身份证号码分别进行测试。运行代码后,可以得到如下输出:
身份证号码 320124198808088888 是否合法:是
身份证号码 12345678901234567 是否合法:否
3. 总结
通过以上代码和测试样例,我们可以看到,通过使用模11-2校验码计算方法,我们可以验证一个身份证号码是否合法。这在一些需要对身份进行验证的场景中非常有用,如开户、办理证件等。
需要注意的是,身份证号码的合法性校验只能保证身份证号码的基本规则符合标准,但不能保证该身份证号码对应的人是真实存在的。因此,在实际应用中,还需要结合其他验证手段来确保身份的真实性。