身份证前六位为区号, 中间八位为出生日期, 再后三位为顺序码, 偶数分配给女性, 奇数给男性, 最后一位为校验位, 值为身份证前十七位 加权求和 然后对11取模 进行映射
权值为 [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
映射为 ["1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"]
示例代码(JS)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| function verify(idCardNumber) { const REG = /\d{17}[\dX]/; const W = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]; const V = ["1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"]; const C0 = "0".charCodeAt(0);
if (!REG.test(idCardNumber)) { return false; }
let sum = 0; for (let i = 0; i < idCardNumber.length - 1; i++) { sum += ((idCardNumber.charCodeAt(i) - C0) * W[i]); }
let v = V[sum % 11]; return idCardNumber.charAt(idCardNumber.length - 1) == v; }
|