身份证规则
这里只讲18位的身份证(二代身份证)号码规则,由6位地址码 + 8位生日码 + 3位顺序码 + 1位校验码组成。
地址码(6位)
这个可以在网上搜索到完整的地址码对照表(底部有链接)。这里贴个截图:
生日码(8位)
以yyyyMMdd格式表示的生日。如:19900123
顺序码(3位)
是指当前地址内同一天出生的顺序号,奇数指男性,偶数指女性。
校验码(1位)
校验码由前面17位(6位地址码 + 8位生日码 + 3位顺序码)计算得到。
加权码
| 序号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|---|---|---|---|---|---|---|---|---|---|---|
| 加权码 | 7 | 9 | 10 | 5 | 8 | 4 | 2 | 1 | 6 | 3 |
| 序号 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
|---|---|---|---|---|---|---|---|
| 加权码 | 7 | 9 | 10 | 5 | 8 | 4 | 2 |
加权码生成规则
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]
校验码
| 余数 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 校验码 | 1 | 0 | X | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 |
计算规则
前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