原来身份证末尾数由算法得出,难怪有尾数 X 的

2014-12-24 21:26:44 +08:00
 jsthon
居民身份证号码,根据〖中华人民共和国国家标准 GB 11643-1999〗中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。 居民身份证是国家法定的证明公民个人身份的有效证件。
  地址码
  (身份证前六位)表示编码对象常住户口所在县(市、旗、区)的行政区划代码。
  生日期码
  (身份证第七位到第十四位)表示编码对象出生的年、月、日,其中年份用四位数字表示,年、月、日之间不用分隔符。例如:1981年05月11日就用19810511表示。
  顺序码
  (身份证第十五位到十七位)为同一地址码所标识的区域范围内,对同年、月、日出生的人员编定的顺序号。其中第十七位奇数分给男性,偶数分给女性。
  校验码
  (身份证最后一位)是根据前面十七位数字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的检验码。作为尾号的校验码,是由号码编制单位按统一的公式计算出来的,如果某人的尾号是0-9,都不会出现X,但如果尾号是10,那么就得用X来代替,因为如果用10做尾号,那么此人的身份证就变成了19位,而19位的号码违反了国家标准,并且我国的计算机应用系统也不承认19位的身份证号码。Ⅹ是罗马数字的10,用X来代替10,可以保证公民的身份证符合国家标准。


尾数叫校验码,是用前17位用以下公式计算出来的:
校验码
(1)十七位数字本体码加权求和公式
S = Ai * Wi, i = 2, ... , 18
Y = mod(S, 11)
i: 表示号码字符从右至左包括校验码字符在内的位置序号
Ai:表示第i位置上的身份证号码字符值
Wi:表示第i位置上的加权因子
i: 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 1
(2)校验码字符值的计算
Y: 0 1 2 3 4 5 6 7 8 9 10
其中:为保证身份证为18位,故把10改用罗马数字X表示。所以说,你的身份证号尾数为X,表示你的身份证号前17位通过计算,结果为10。


查阅了相关资料才知道,

又长知识了。
9323 次点击
所在节点    分享发现
35 条回复
jsthon
2014-12-24 21:42:00 +08:00
wzxjohn
2014-12-24 21:54:27 +08:00
是楼主年龄太小还是我年龄太大。。。N年前用多种方法实现过这个。。。最蛋疼的是帮老师用Excel实现。。。

PS:我记得似乎高中数学会说一下这个。。。不知道是不是我们这边课本的个别现象。。。
zhengkai
2014-12-24 22:06:36 +08:00
https://soulogic.com/archives/364 n年前的困惑

楼主你想过没有,“由算法得出”跟“结尾有X”没有任何必然联系

X 的原因只不过他的算法最后一步是 mod 11,但为什么是 11 呢?如果 mod 10,或者 mod 100(这样有两个校验位)就完全没这个问题,匪夷所思
laobubu
2014-12-24 22:10:19 +08:00
昨天翻老帖子的时候还遇到过这么一篇:

http://www.v2ex.com/t/47712

其中有一个真是碉堡了
```python
get_id = lambda s:s+str((1-2*int(s, 13)) % 11).replace('10', 'X')
```
jsthon
2014-12-24 22:28:40 +08:00
@wzxjohn 我是头一次听说这个,周围同学也没听过。嘿嘿


@zhengkai 我的意思是尾数X不是随机的呀,是因为通过算法得出数字“10”,才用“X”表示的。
luikore
2014-12-24 22:36:31 +08:00
其实逻辑很简单... 看 ruby 的实现:

https://gist.github.com/luikore/cc42d6eeec6f5f1e389b
mind3x
2014-12-24 22:37:41 +08:00
@zhengkai 因为11是最接近10的质数
iyaozhen
2014-12-24 22:46:27 +08:00
涨姿势了,我一直以为x是那个县当天出生的人数太多,就用x表示了。
yaoye0o
2014-12-24 22:52:25 +08:00
一直以为十五位到十八位是按顺序排的四位数,虽然偶尔也会想想“0”和“X”的问题。可我作为male第十七位是“2”是怎么回事😒
wolfan
2014-12-24 22:53:41 +08:00
好像用算法得出的身份证应该是从第三代开始的吧。
zhengkai
2014-12-24 23:44:05 +08:00
@mind3x 你能告诉我质数在这里的用途么?这里的取模的目的只是个超短的 CRC(循环冗余校验)而已的
ffffwh
2014-12-24 23:55:42 +08:00
@mind3x
同求质数用途

@yaoye0o
围观
jybox
2014-12-25 00:01:03 +08:00
SharkIng
2014-12-25 00:37:58 +08:00
你才知道啊
ligyxy
2014-12-25 01:01:08 +08:00
因为是质数,所以不会出现有仅一位出错而校验位不变的情况
Quaintjade
2014-12-25 01:20:09 +08:00
关于身份证的几种算法解释及比较参见:
http://ycool.com/post/9quymdc

LZ贴的是国标规范,那算法是为极小内存的设备设计的。如果是电脑/手机程序,则没必要用那算法。
chigco
2014-12-25 02:27:24 +08:00
才知道。。
ericls
2014-12-25 03:37:57 +08:00
很久很久以前 就有升位计算器了。。

还有大陆生份证自动生成器
Showfom
2014-12-25 03:56:56 +08:00
再来科普个 电话区号的最后一位是没有0的 0代表10

所以 0570 是衢州 0571 是杭州 1最大 10最小

020 广州 021 上海 其实当初的顺序是上海最大 广州最小
xdlailai
2014-12-25 08:45:45 +08:00
我是x~~早就科普了下

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

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

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

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

© 2021 V2EX