0
点赞
收藏
分享

微信扫一扫

JavaScript身份证号校验算法

身份证号校验规则

身份证号码的校验主要基于国家标准GB11643-1999,18位身份证号的最后一位是校验码,通过前17位计算得出。校验算法分为以下几个部分:

校验码计算方法

  1. 加权因子
  • 前17位数字分别乘以对应的加权因子,加权因子为固定值:
  • [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
  1. 计算加权和
  • 将前17位数字与加权因子逐位相乘,再将结果相加,得到加权和 S。
  1. 取模计算
  • 用加权和 S 除以11,取余数 Y = S % 11。
  1. 校验码对应表
  • 根据余数 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;

其他校验规则

  1. 行政区划码校验
  • 前6位是行政区划码,需符合国家行政区划编码规则(可通过公开的行政区划代码表校验)。
  1. 出生日期校验
  • 第7-14位是出生日期,需为合法日期(如月份在1-12之间,日期符合当月天数)。
  1. 顺序码校验
  • 第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 必须大写)。
举报

相关推荐

0 条评论