杂记 › 技术笔记 › 身份证最后一位为什么是 X?前 17 位加权取模算出的校验位

身份证最后一位为什么是 X?前 17 位加权取模算出的校验位

表单提示身份证号无效、自己却确定没填错;或者写校验时想知道到底该信哪一层。这两种情况都要回到那一位校验码:它是前 17 位算出来的,末尾那个 X 也只是同一个算法的结果。整条链路只有三步——加权、求和、取余查表。

18 位号码的结构

前 6 位是地址码,接着 8 位是出生日期,再 3 位顺序码(同一天同一区域内的排列,末位奇偶区分性别),最后 1 位是校验码。前 17 位携带全部身份信息,第 18 位什么都不携带,它只负责一件事:让前面 17 位可以被算术验证。

三步算出校验位

  1. 前 17 位逐位乘以权重 7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2,再把 17 个乘积相加。
  2. 用这个和对 11 取余,余数落在 0 到 10 之间。
  3. 按余数查表得到校验位:0 到 10 依次对应 1,0,X,9,8,7,6,5,4,3,2。

拿一个公开的演示号段走一遍:前 17 位 11010519491231002,加权求和得 167,167 除以 11 余 2,查表得到 X,完整号码就是 11010519491231002X。

位序数字权重乘积
1177
2199
30100
4155
5080
65420
7122
8919
94624
109327
11177
122918
1331030
14155
15080
16040
17224

右列 17 个乘积相加:7+9+0+5+0+20+2+9+24+27+7+18+30+5+0+0+4 = 167。这张表也是最好用的核对载体——自己算一遍如果对不上 167,就是某一位的权重抄错了。

权重不是随手定的

那串 7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2 是 2 的幂取模的产物:第 i 位(从 1 数起)的权重等于 2 的 (18−i) 次方对 11 取余。逐位推一遍能全部对上——2 的 17 次方模 11 得 7,2 的 16 次方得 9,2 的 15 次方得 10,一路降到 2 的 1 次方得 2。查表那一步同样有出处:余数 r 对应的校验值就是 (12 − r) 对 11 取余,r 为 2 时算出 10,而 10 只能写成 X。

X 不是留给谁的特殊标记

按公式,余数为 2 的这一档算出来的校验值是 10。号码要求每一位都是单个字符,而 10 是两位,就用罗马数字 X 顶替占这一格。所以末位是 X 只说明前 17 位的加权和恰好模 11 余 2,与出生日期、登记地区都没有关系,更不是什么特殊身份的标识。

它能发现什么、发现不了什么

2 的任何次方对 11 取余都落在 1 到 10 之间,永远不为 0——余数序列是 2,4,8,5,10,9,7,3,6,1,然后回到 2,周期为 10。把某一位从 d 改成 e,加权和的变化量是 (e−d) 乘以该位权重;要让改动察觉不到,这个乘积就得是 11 的倍数,而 |e−d| 最大只有 9,权重本身又不是 11 的倍数,凑不出来。我把 17 个位置上所有可能的单字符改动枚举了一遍:每个位置有 9 种别的数字可填,共 153 种,改完之后校验位仍等于原值 X 的有 0 种。所以「一次手滑逃掉」不是概率小,是不可能。

它管不到的是换位。权重表以 10 为周期,第 1 位与第 11 位同为 7、第 2 位与第 12 位同为 9,这样一路到第 7 位与第 17 位同为 2,共七对。数字落在这七对位置里互相调换时,加权和完全不变,校验位照样对得上。这是所有单校验位方案共同的上限,不是实现写错了。

它还保证不了算术之外的任何事:随机拼一串 18 位数字,校验位恰好碰对的概率是十一分之一。固定随机种子跑 200000 组随机前 17 位,末位等于 X 的有 18063 组,占 9.03%,与理论值 9.09% 差 0.06 个百分点。也就是说它挡手滑很有效,挡编造几乎没有作用,更不能证明这个号码对应一个真实存在的人。

15 位老号码怎么变成 18 位

出生年月日从 6 位(YYMMDD)扩到 8 位(YYYYMMDD)时,年份前补上世纪码,末尾再加一位校验。演示号去掉世纪写法是 110105491231002,把 49 补成 1949 之后前 17 位就是 11010519491231002,按三步算出 X,完整的 18 位得到 11010519491231002X。反向做也成立:删掉校验位、再把年份的世纪码去掉,就还原成 15 位写法。处理历史数据时这一段最容易被漏,因为 15 位号码根本没有校验位可查。

工程上分几层来做

输入框里的实时校验跑到校验位这一层就够,它拦得住打错的;需要更硬的确认,就得走实名核验那类通道,两层的成本和能给出的结论完全不同。展示的时候它属于敏感字段,列表里要能辨认又不能整串露出,隐私信息遮掩 处理的就是这类需求。想看同一位思路在别的号码上怎么落地,银行卡校验工具 用的是另一套加权取模规则,权重不同但结构一致;要逐位核对本站这串权重,身份证号码校验 会把加权和、余数与查表结果一并列出来。

Q:改一位能发现,改两位为什么就不一定

单字符改动会改变加权和,而权重的选取让这种改动很难落回同一个余数。同时改两位时,如果两处带来的差值互相抵消,和不变、余数不变,校验位就对得上了。这是所有单校验位方案共同的上限,不是实现写错了。

Q:地址码和出生日期它不管吗

校验位只看整串 17 位的加权和,不判断 6 位区划码是否真实存在,也不判断日期是否合法、是否为闰年。完整的格式校验通常还要补一层出生日期范围检查,那是另外一段独立的逻辑。

Q:X 大写小写都行吗

规则里是 X。多数系统会在输入时容忍小写再转大写,但存储和比对最好统一成一种写法,否则同一个号码会因为大小写差异被判成两条不同记录。

📎 相关文章

网址里哪一段会到服务器?六段拆分与 %20、+、二次编码 2026-10-19 子网掩码写成 /22 能带多少台设备?主机位、网络地址与广播地址 2026-10-19 排版稿没内容可填?占位文本怎么写才不像模板 2026-10-15 两列数据要列出所有组合?分列合并与笛卡尔积 2026-10-15 测试上传限制要多大文件?按需造一个指定大小的 2026-10-15