身份证号的 X 是不是一个糟糕的设计?

2022-07-21 12:40:31 +08:00
 Wallace01
身份证号校验位(最后一位)的设计原理是,用前面的数字通过一系列计算结果除以 11 取余数,分别对应 1-9 和 x 。不用 10 的原因是校验效果不好。

大家觉得这个设计怎么样呢。
10932 次点击
所在节点    问与答
100 条回复
hzcer
2022-07-21 13:23:40 +08:00
因为 11 是质数,10 不是
masterclock
2022-07-21 13:25:39 +08:00
不好,无法理解为什么这么设计
1. 增加了一个原本不使用的符号,无法输入、甚至无法显示
2. X 是什么?很多人不认识、不会读。
3. 模 11 效果比模 10 好很多吗?如果是,还不如升 19 位
Wallace01
2022-07-21 13:26:29 +08:00
个人觉得,不改变校验算法前提下,我宁愿用两位表示校验位,00-10 ,这样比 X 带来的影响小一些
cpstar
2022-07-21 13:45:08 +08:00
换个角度,你要思考为什么这么去校验,一个校验算法,到底要校验什么。目前的算法,前 17 位每一位都用不同的权,但是权不是连续上升或者下降,而是非常离散的,为什么会这样?至于 11 还是 10 ,那就是质数的问题了,那问题来了,能否模 7 ,把校验位降到 0-6 ?
why ? why ? why ?刨根问底,你就能理解这个算法,并且直接回答这个 X 到底是巧妙还是冗余了。
JNotEnoughW
2022-07-21 13:46:14 +08:00
@teasick 是的赞同 相比于表现形式 我也更加反感如此赤裸的内容拼接
cpstar
2022-07-21 13:46:52 +08:00
补充 24#,反正现在 18 位如果校验不过去,是能够直接定位哪一位错误的,而存在两位错误我就不知道了。
zqqf16
2022-07-21 13:48:08 +08:00
我的最后一位就是 X ,平时用起来还好,就是有时候会遇到奇葩系统,X 竟然区分大小写……
Wallace01
2022-07-21 13:48:47 +08:00
@teasick 以及性别
hertzry
2022-07-21 13:49:23 +08:00
X 不就是 10 吗?用一位表示了 11 个数,挺好的想法。
luob
2022-07-21 13:50:44 +08:00
校验位带个 X 这个设计恐怕也是 90 年代把世界各国的各种规章制度稀里糊涂乱抄一气的产物之一,不知道有没有谁能考证一下

不过它既然成功地活了下来,换了三轮身份证都没被重新设计,说明总体上还是没啥问题的
agegcn
2022-07-21 13:57:20 +08:00
可能两位校验更好。可以取模更大的质数
stephenyin
2022-07-21 14:07:26 +08:00
就算是表示 10 ,也应该用 A 啊,用 X 什么鬼设计?不懂 16 进制的人真的是没法交流。
myevery
2022-07-21 14:12:07 +08:00
@hzcer 为什么不用 7
Maxxxxyu
2022-07-21 14:17:18 +08:00
@stephenyin #32 罗马数字 10 就是 X ,估计是因为这个啊
PureTentacle
2022-07-21 14:19:21 +08:00
@stephenyin 罗马数字啊
dcsuibian
2022-07-21 14:30:07 +08:00
不是。
1 、身份证校验位可以离线先过滤掉一些输入错误,毕竟身份证那么长。
2 、上面有人说了,11 是质数,10 不是,那“10 进制是不是一个糟糕的设计?”
3 、X 对应的是罗马数字 10 ,跟 16 进制没啥关系。对文盲,X 可比 A 好多了,你见过几个人念 iphone ten 而不是 iphone 叉呢。
4 、争端主要在于 X 和双校验位。确实,双校验位就只用数字了。但 X 也有好处,因为真的会有 nc 程序员在数据库里用整形存手机号。
snw
2022-07-21 14:44:37 +08:00
讨论了这么多楼层,都没有人提到这个标准算法的来源吗?

身份证校验位是个标准算法,来自于 ISO/IEC 7064 里的 MOD 11-2 ,国标是 GB 11643 。
另外,这个 ISO 里也有 MOD 11-10 的算法可以让校验位落在 0-9 ,但属于 Hybrid System ,算起来比较麻烦,更重要的是没有快速算法。
libook
2022-07-21 14:44:56 +08:00
参考国家标准《公民身份号码》编号为 GB 11643-1999 ,有这么一个信息:“值等于 10 时,用罗马数字符 X 表示。”

标准都是公开的,防伪造不大现实,个人认为可能防止录入错误的效果更好。

直觉上阿拉伯数字之余多了个罗马数字确实可能在使用上会有些不便,但说是糟糕设计倒还不至于。

这让我想到新入职的开发人员可能会对系统现有设计有诸多看法,但其实很多都是因为一些历史上的变化与取舍才最终发展成这样的,不能完全抛开历史包袱于不顾。
所以最好是能找到一些当年设计身份号码的过程记载,看看为什么最终选择了这个方案,看看当年选择这个方案是否合理,以及发展到现在是否必然。
20015jjw
2022-07-21 14:47:34 +08:00
都是数字
visa 最后一位也是校验
不细说
HiCoder
2022-07-21 14:52:33 +08:00
银行账号、三大卡卡组织的卡号,都是有校验位的,防止输错

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/867724

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX