身份证号码的有效性校验

725 阅读1分钟

身份证号码的有效性校验

根据GB11643-1999的标准,对18位身份证进行有效性校验。

定义

在18位身份证中,身份证的前17位成为本体码 master number,第18位成为校验码 check number,根GB11643-1999的算法,由身份证号码的前17位,即可计算出第18位----校验码的值,从而对该身份证号码的有效性进行判断。

/**
 * @desc                    根据GB11643-1999校验身份证号码的有效性
 * @param {string}  idCard  18位身份证号码
 */
export function isValidCitizenIdNumber(idCard) {
  idCard = idCard
    .trim()
    .replace(/\ +/g, '')
    .replace(/[\r\n]/g, '');
  if (idCard.length !== 18) return false;
  /** 公民身份证号码中各个位置上的加权因子Wi数值 */
  const wList = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1];
  /** 各个位置取模(%11)后,各个值对应的校验码字符 */
  const aList = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];
  /**
   * @desc 本体17位的ai * Wi的值列表
   * @type {Array<number>}
   */
  const awList = new Array(17).fill(0);
  for (let i = 0; i < 17; i++) {
    if (isNaN(Number(idCard[i]))) return false;
    awList[i] = Number(idCard[i]) * wList[i];
  }
  /** 身份证本体的级数之和 */
  const sum = awList.reduce((prev, curr) => prev + curr);
  /** 第18位/校验码的值 0-10 */
  const m = sum % 11;
  // 根据m获得第18位的正确值,然后进行校验,返回校验结果
  return aList[m] === idCard[17];
}