使用方法
在输入框粘贴十八位号码,按回车或点击“校验并解析”。页面先检查长度、字符、地址码、日期与顺序码,再用前十七位逐位乘权重,最后比较计算值和实际末位。结果区会写明合法性、省级地址、生日、顺序码、性别以及应有校验位;末位写错时不会只给出笼统提示,而会直接列出实际值与复算值。输入十五位一代号码时,页面按既定规则插入世纪标记并生成新末位。全部运算在当前页面完成,号码不会因点击校验而发送到服务端。
首屏示例为 11010519491231002X。它适合核对含字母校验位的路径。另一个按钮载入 440524188001010014,用于观察数字校验位、广东地址码和奇数顺序码。加权明细先显示十二行,点击“加载更多”后展开前十七位;复制按钮输出制表符文本,CSV 导出包含表头与完整明细。
阅读结果时可以从明细反向排错:先找输入数字所在的位置,再核对该位置固定权重和乘积,随后检查加权和的余数,最后才查映射字符。这样的顺序能区分“某一位抄错”“权重顺序放反”和“余数映射写错”三类实现问题。若只比较最终末位,前两步出现的偏差会被总和掩盖,难以定位代码中的具体位置。
能解决什么
身份证号校验的关键不是判断“看起来像十八位”,而是确认各字段能相互约束。一个字符串即使长度正确,也可能含有不存在的日期、未知的省级代码、不可用的顺序码,或末位没有通过 MOD 11-2。页面把这些路径分开报告,便于定位录入错误:日期错误应回到出生日期字段,末位错误则可以保留前十七位并改成复算结果。批量录入前先用单条号码核对规则,也能确认业务系统是否错误地把 X 当作普通字母排除。
本页在工具目录中的名称是“身份证号校验”。它还处理一代十五位号码升级:不是在末尾直接补字符,而是在前六位地址码之后加入 19,保留后九位,组成新的前十七位,再从头计算末位。这个步骤适合迁移旧档案字段,也能避免把原十五位的日期段错当成四位年份。
原理与变量
十八位结构依次是六位地址码、八位出生日期、三位顺序码和一位校验码。程序把前十七位记作 a,固定加权因子依次为 [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2]。逐位乘积求和后对 11 取余,余数再查映射 [1,0,X,9,8,7,6,5,4,3,2]。所以余数 0 对应 1,余数 2 对应 X;它不是把余数本身放到末位,也不是用 11 减余数后直接拼接。
校验位 = IDCHK[Σ(ai × Wi) mod 11]
地址码在本页只解析前两位对应的省级名称,例如 11 为北京、44 为广东、51 为四川。市级和区级不在脚本中展开,避免把庞大的行政区划表塞进内联代码;这也意味着“省级代码可识别”不等于当前区县名称仍然有效。出生日期按真实日历核验。顺序码看最后一位的奇偶,奇数记为男,偶数记为女;末三位为全零时不作为有效顺序码。
权重必须从地址码首位开始使用,不能从生日段起算,也不能把数组倒序。映射同样不能写成连续递减数字,因为余数 0 与 2 分别落到 1 与 X。页面把“乘权重”和“查映射”拆成两个阶段:前者只产生整数总和,后者才把余数变成末位字符。这种分层与标准测试号的 X 结果相互验证。
完整示例
标准测试号 11010519491231002X 的前十七位复算结果是 X,与实际末位一致,因此状态为合法。地址码 110105 的省级前缀是 11,显示北京;生日拆为 1949-12-31;顺序码是 002,末位为偶数,所以显示女。这里的每一项都由同一输入拆出,并非独立填写。
十五位示例 110105491231002 先变成前六位加 19 再加后九位,得到新的前十七位,最终升级为 11010519491231002X,与标准测试号一致。广东测试号 440524188001010014 的校验位为 4,省级前缀 44 显示广东,顺序码 001 为奇数,所以显示男。把生日改成 1990-01-01 后,完整号应为 440524199001010018,新的校验位是 8。
440524188001010014 中的 1880-01-01 是公开流传算法测试号里的占位生日,页面仍按日历规则解析它。把年份替换为 1990 后,不能沿用原来的末位 4;前十七位已经变化,必须得到新的 8。这个对照专门检验实现是否真的读取生日段参与乘权重,而不是只检查地址和顺序码。
对照表
| 输入或变更 | 复算结论 | 解析重点 |
|---|---|---|
| 11010519491231002X | 末位 X,合法 | 北京,1949-12-31,002 为偶数,女 |
| 440524188001010014 | 末位 4,合法 | 广东,001 为奇数,男 |
| 440524199001010018 | 末位 8,合法 | 生日改为 1990-01-01 后重新计算 |
| 110105491231002 | 升级后末位 X | 得到 11010519491231002X |
| 首位由 1 改为 2 | 校验位由 X 变为 3 | 任一参与加权的数字变化都会影响总和 |
对照表强调“输入变化必须触发复算”。页面没有为这些号码设置硬编码结果;按钮执行的仍是权重乘积、求和、取余和查表流程。因而用户替换任一位数字时,明细表会同步改变对应乘积与总和所指向的校验码。
结果边界与舍入
这套算法全部是整数运算,不存在小数舍入。真正的边界来自格式与数据范围:前十七位必须全是数字,末位只能是数字或大写 X;输入小写 x 时页面会先规范为大写再复算,并在结果里说明规范化动作。出生日期必须能由日历还原,省级前缀必须在内置表中,顺序码不能全为零。把标准号首位从 1 改为 2 后,应有校验位会从 X 变成 3,说明校验位能发现常见单字符改动。
校验通过只表示号码结构、日期和校验码彼此一致,不执行联网实名比对,也不判断号码当前是否被实际使用。地址仅显示省级前缀,不推断市县;旧地址码可能对应历史区划。导出的明细保留每一位的权重与乘积,适合检查自己的实现在哪个位置出现偏差。
录入系统还应把号码字段按文本保存。若按普通数值处理,末位 X 无法表示,开头数字与固定长度也可能被破坏。比较两个号码前可统一清理首尾空白并规范 X 的大小写,但不能删除中间字符后假装输入原本有效;页面因此会把空格或其他符号明确报为字符格式问题。
常见问题
为什么余数 2 对应 X?
因为 GB 11643 使用 ISO 7064 MOD 11-2 的指定映射表,余数按顺序查 1、0、X、9、8、7、6、5、4、3、2。余数与末位字符不是同一个数值。
小写 x 会怎样处理?
页面先记录输入中出现了小写字符,再统一转成大写 X 参与格式检查和复算。结果会提示规范写法,复制或入库时应保存大写形式。
十五位号码为什么要插入 19?
一代号码的生日年份只有两位。升级规则是在前六位地址码之后插入 19,再接原后九位形成前十七位,最后重新计算校验位。
性别看身份证号的哪一位?
看三位顺序码的最后一位,也就是十八位号码的第十七位。奇数显示男,偶数显示女,校验位 X 不参与性别判断。
为什么只显示省级地址?
脚本按地址码前两位给出省级名称。市县代码数量大且会随区划调整,本页不把市县名称写死,避免把过期名称当成当前结论。
末位错了还能看到解析信息吗?
可以。只要前十七位的地址、日期和顺序码能通过结构检查,页面仍展示解析字段,并明确给出实际末位和应有末位。
X 是英文字母吗?
在号码表示中,X 表示映射表给出的罗马十。它出现在末位时是合法校验码,但不能出现在前十七位的数字字段中。
通过校验是否等于实名一致?
不是。通过表示格式、日期与校验位关系成立;页面不连接身份数据库,也不把姓名与号码做匹配。它解决的是规则复算问题。
相关工具
校验不同编码时应使用对应规则,不要把身份证的 MOD 11-2 权重套到银行卡、统一社会信用代码或网址别名上。以下入口均使用站内实际分类路径: