身份证号校验规则
身份证号码的校验主要基于国家标准GB11643-1999,18位身份证号的最后一位是校验码,通过前17位计算得出。校验算法分为以下几个部分:
校验码计算方法
- 加权因子
- 前17位数字分别乘以对应的加权因子,加权因子为固定值:
- [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
- 计算加权和
- 将前17位数字与加权因子逐位相乘,再将结果相加,得到加权和 S。
- 取模计算
- 用加权和 S 除以11,取余数 Y = S % 11。
- 校验码对应表
- 根据余数 Y 的值,从下表查找对应的校验码:
- [1, 0, X, 9, 8, 7, 6, 5, 4, 3, 2]
- 校验码为第 Y 位的字符(从0开始)。da
代码实现
function validateIDCard(idCard) {
// 基本格式校验
if (!/^\d{17}[\dXx]$/.test(idCard)) {
return false;
}
// 加权因子
const weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
// 校验码对应表
const checkCodes = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];
// 计算加权和
let sum = 0;
for (let i = 0; i < 17; i++) {
sum += parseInt(idCard.charAt(i)) * weights[i];
}
// 计算校验码
const mod = sum % 11;
const checkCode = checkCodes[mod];
// 校验最后一位
return idCard.charAt(17).toUpperCase() === checkCode;
其他校验规则
- 行政区划码校验
- 前6位是行政区划码,需符合国家行政区划编码规则(可通过公开的行政区划代码表校验)。
- 出生日期校验
- 第7-14位是出生日期,需为合法日期(如月份在1-12之间,日期符合当月天数)。
- 顺序码校验
- 第15-17位是顺序码,奇数表示男性,偶数表示女性。
完整代码
function fullValidateIDCard(idCard) {
// 基本格式校验
if (!/^\d{17}[\dXx]$/.test(idCard)) {
return false;
}
// 校验行政区划码(示例:仅校验前2位为省级代码)
const provinceCode = idCard.substring(0, 2);
if (parseInt(provinceCode) > 91 || parseInt(provinceCode) < 11) {
return false;
}
// 校验出生日期
const birthDate = idCard.substring(6, 14);
const year = parseInt(birthDate.substring(0, 4));
const month = parseInt(birthDate.substring(4, 6));
const day = parseInt(birthDate.substring(6, 8));
const date = new Date(year, month - 1, day);
if (
date.getFullYear() !== year ||
date.getMonth() + 1 !== month ||
date.getDate() !== day
) {
return false;
}
// 校验校验码
return validateIDCard(idCard);
}
注意事项
- 15位身份证号无校验码,需升级为18位后再校验。
- 行政区划码和出生日期校验需结合实际需求补充完整逻辑。
- 校验码计算区分大小写(
X
必须大写)。