JavaScript身份证号校验算法
身份证号校验规则
身份证号码的校验主要基于国家标准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开始)。
实现代码
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
必须大写)。