身份证规则&校验

1,385 阅读2分钟

身份证规则

这里只讲18位的身份证(二代身份证)号码规则,由6位地址码 + 8位生日码 + 3位顺序码 + 1位校验码组成。

地址码(6位)

这个可以在网上搜索到完整的地址码对照表(底部有链接)。这里贴个截图:

生日码(8位)

以yyyyMMdd格式表示的生日。如:19900123

顺序码(3位)

是指当前地址内同一天出生的顺序号,奇数指男性,偶数指女性。

校验码(1位)

校验码由前面17位(6位地址码 + 8位生日码 + 3位顺序码)计算得到。

加权码

序号12345678910
加权码79105842163
序号11121314151617
加权码79105842
加权码生成规则
const factors = [];
for (let i = 18; i > 1; i--) {
  const factor = Math.pow(2, i - 1) % 11;
  factors.push(factor);
}
console.log(factors);
// [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]

校验码

余数012345678910
校验码10X98765432

计算规则

前17位码(6位地址码+8位生日码+3位顺序码),每一位码数值乘以对应序号位置的加权码,然后将这17个数求和,将这个和数取模数字11得到余数,对照校验码表,得到校验码。

举例

前17位码为:110101 19990820 234

const factors = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
const idNo = '11010119990820234';
const total = factors.reduce(
  (prev, cur, index) => prev + cur * idNo[index],
  0
);
const checkCodes = ["1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"];
const checkCode = checkCodes[total % 11];
console.log(checkCode);
// 9

参考

  1. 实名认证前传之身份证号码编码规则
  2. 地址码对照表