中国居民身份证号码不是随机数字,18 位里每一段都有明确含义:前 6 位是地址码,中间 8 位是出生日期,接下来 3 位是顺序码,最后 1 位是校验码。知道这套规则,就能理解身份证号码本身"能验证什么、不能反查什么"。
以一个符合规则但非真实存在的示例号码 110105199003072311 拆解:
110105 19900307 231 1
地址码 出生日期 顺序码 校验码
YYYYMMDD地址码采用的是号码签发时的行政区划代码,对照 GB/T 2260 标准表即可查到省市区。需要注意两点容易被误解的地方:
校验码不是随便填的,而是由前 17 位数字按固定权重加权求和、再对 11 取模算出来的,具体步骤:
第一步:给第 1~17 位分别乘以对应的权重因子:
| 位次 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 权重 | 7 | 9 | 10 | 5 | 8 | 4 | 2 | 1 | 6 | 3 | 7 | 9 | 10 | 5 | 8 | 4 | 2 |
第二步:把 17 个乘积相加,对 11 取余数,余数对应下表得出校验码:
| 余数 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 校验码 | 1 | 0 | X | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 |
这就是为什么身份证最后一位有时是字母 X(代表罗马数字 10)——余数为 2 时算出来的校验码本该是"10",但号码只留一位,用 X 表示。这套算法(ISO 7064:1983 MOD 11-2)能检测出单个数字抄错和两个相邻数字调换顺序这两类最常见的人工输入错误。
1999 年之前发行的是 15 位号码,格式是 地址码(6) + 出生日期(6,仅年月日各2位) + 顺序码(3),没有校验码。升 18 位的规则很固定:
19(因为 15 位号码只用两位数字表示年份,默认都是 19xx 年出生)这也是为什么升位后的号码前 17 位是确定的,只有最后一位校验码是"算出来"而不是"抄"过来的。
不能。 身份证号码本身只是"编码规则"——地址码对应的是行政区划表,出生日期是拆出来的日期数字,顺序码和校验码是编号和算法结果,整个号码里不包含姓名、住址、照片等任何个人身份信息,也没有反向查询的数学关系。能查到姓名住址的是公安系统内部的身份证数据库,那是另一套需要授权才能访问的系统,和号码本身的编码规则无关。
// 校验码计算(不含地址码合法性校验)
function checkCode(id17) {
const weights = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2];
const codes = ['1','0','X','9','8','7','6','5','4','3','2'];
let sum = 0;
for (let i = 0; i < 17; i++) sum += Number(id17[i]) * weights[i];
return codes[sum % 11];
}
console.log(checkCode('11010519900307231')); // => '1'
在线工具:身份证号码解析校验