反馈

身份证号码结构解析:地址码、出生日期和校验位怎么算的

中国居民身份证号码不是随机数字,18 位里每一段都有明确含义:前 6 位是地址码,中间 8 位是出生日期,接下来 3 位是顺序码,最后 1 位是校验码。知道这套规则,就能理解身份证号码本身"能验证什么、不能反查什么"。


目录

  1. 18 位号码的四段结构
  2. 地址码:归属地怎么查
  3. 校验码:ISO 7064 MOD 11-2 算法
  4. 15 位老号码怎么升 18 位
  5. 身份证号码能反查姓名住址吗
  6. 代码示例

1. 18 位号码的四段结构

以一个符合规则但非真实存在的示例号码 110105199003072311 拆解:

110105  19900307  231  1
地址码   出生日期   顺序码 校验码
  • 地址码(6 位):按 GB/T 2260 行政区划代码,前 2 位省、中 2 位市、后 2 位区县
  • 出生日期码(8 位):格式固定为 YYYYMMDD
  • 顺序码(3 位):同一地区同一天出生的人的编号,第 17 位(顺序码最后一位)单数为男性,双数为女性
  • 校验码(1 位):由前 17 位计算得出,用于检测号码是否有单个数字被抄错

2. 地址码:归属地怎么查

地址码采用的是号码签发时的行政区划代码,对照 GB/T 2260 标准表即可查到省市区。需要注意两点容易被误解的地方:

  • 地址码反映的是户籍登记地,不是出生地或现居住地——很多人身份证地址码是父母户籍所在地,本人可能从未在那里长期生活
  • 行政区划会调整(撤县设区、地名变更),老号码里的地址码可能对应的是当年的行政区划,直接拿现在的地图去核对可能会对不上,需要查历史沿革

3. 校验码:ISO 7064 MOD 11-2 算法

校验码不是随便填的,而是由前 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)能检测出单个数字抄错两个相邻数字调换顺序这两类最常见的人工输入错误。

4. 15 位老号码怎么升 18 位

1999 年之前发行的是 15 位号码,格式是 地址码(6) + 出生日期(6,仅年月日各2位) + 顺序码(3),没有校验码。升 18 位的规则很固定:

  1. 在第 7-8 位插入世纪码 19(因为 15 位号码只用两位数字表示年份,默认都是 19xx 年出生)
  2. 用升位后的 17 位数字,按上面的算法重新计算出第 18 位校验码

这也是为什么升位后的号码前 17 位是确定的,只有最后一位校验码是"算出来"而不是"抄"过来的。

5. 身份证号码能反查姓名住址吗

不能。 身份证号码本身只是"编码规则"——地址码对应的是行政区划表,出生日期是拆出来的日期数字,顺序码和校验码是编号和算法结果,整个号码里不包含姓名、住址、照片等任何个人身份信息,也没有反向查询的数学关系。能查到姓名住址的是公安系统内部的身份证数据库,那是另一套需要授权才能访问的系统,和号码本身的编码规则无关。

6. 代码示例

// 校验码计算(不含地址码合法性校验)
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'

在线工具:身份证号码解析校验