Python的良民证算法

2012-09-14 14:35:52 +08:00
 phuslu
based on @est version
http://www.newsmth.net/bbstcon.php?board=Python&gid=95585

>>> get_id = lambda s: s[:17]+'10X98765432'[sum(int(a)*(int(b)+1) for a,b in zip(s,'68947310526894731'))%11]
>>> get_id('34052419800101001')
'34052419800101001X'
7566 次点击
所在节点    Python
13 条回复
est
2012-09-14 14:51:46 +08:00
@phuslu 你是goagent作者?厉害啊。。。
phuslu
2012-09-14 15:00:19 +08:00
@est 过奖啦,对你神交已久了~~
phuslu
2012-09-14 15:15:45 +08:00
http://www.newsmth.net/bbscon.php?bid=284&id=95592

get_id = lambda s: s + '1X864209753'[int(s, 13) % 11]
est
2012-09-14 15:26:14 +08:00
@phuslu 这个是错的。原版算法如下:

http://www.keakon.net/2009/03/07/%E7%94%A8Python%E8%AE%A1%E7%AE%97%E8%BA%AB%E4%BB%BD%E8%AF%81%E6%A0%A1%E9%AA%8C%E7%A0%81



1. 将号码的前17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
2. 将这17位数字和系数相乘的结果相加。
3. 用加出来和除以11,得到余数。
4. 余数的结果只可能为0 1 2 3 4 5 6 7 8 9 10这11种,分别对应的最后一位身份证的号码为1 0 X 9 8 7 6 5 4 3 2。
shector
2012-09-15 22:19:50 +08:00
@est 那个没错吧,系数其实是 2^i % 11 (i 从右侧算起),当作 13 进制的话乘的 (11 + 2)^i % 11 正好是 2^i % 11.
aristotle9
2012-09-16 00:20:40 +08:00
@shector
是这样的,不过13进制的最右位指数是0而不是1,导致结果的余数是原来余数乘13前的余数,最终的查找表作相应的修正:
"1X864209753",生成代码(Haskell)为
["10x98765432" !! (x * 2 `mod` 11) | x <- [0..10]]
ivanlw
2012-09-16 01:16:58 +08:00
@est 怎么看出来是g的作者的……
alex_ilex
2012-09-16 01:32:10 +08:00
@ivanlw 看个人信息的Github页面...I guess
fuxkcsdn
2012-09-16 11:30:11 +08:00
get_id('12345678910111213')
虽然简短,但完全没验证...
JS蛋疼版
function getId(s){for(var i=0,n=0;i<17;)n+=parseInt(s.charAt(i),10)*(parseInt("68947310526894731".charAt(i++),10)+1);return s.slice(0,17)+"10X98765432".charAt(n%11);}
Jet
2012-09-16 19:43:19 +08:00
我靠,从上述数字中惊讶发现了自己的银行密码...
est
2012-09-20 13:34:12 +08:00
@phuslu

又看到一位巨牛更加碉堡的写法了。。

get_id = lambda s:s+str((1-2*int(s, 13)) % 11).replace('10', 'X')

给跪了。。。。
bitsmix
2012-09-20 13:49:37 +08:00
我写的 coffee 版的 ..

http://gist.github.com/2203189
ljbha007
2012-09-20 14:36:34 +08:00
良民证是什么?

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

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

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

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

© 2021 V2EX