我竟然用树莓派+python算出了兄弟苦苦追求的女神SFZ号!
0.事情的起因
我发小大学里遇到了他的梦中情人——热娜娅
两年的相处,从慢慢接触到熟悉起来两个人已经成为好朋友,
发小的表白计划也提上日程
但他遇到一个问题使他表白计划一拖再拖
问过之后才知道是因为不知道女神的SFZ
号码,他需要两个人的SFZ
号来做成一件有意义的礼物
作为一个为女人插兄弟两刀的......咳咳......为兄弟两肋插刀当代新青年
主动揽下了这个重任
1.信息的收集
我向他收集了关于女神的一些信息。
他陆陆续续给我提供了如下信息,女神热娜娅是西藏拉萨人,是一个99年的妹子,生日是9月13日,两人一起做过动车,是他订的票,在订票App上输入过SFZ
号,可是当他把截图发给我时候却只有下面的部分:
根据他提供给我的全部信息,我大致把这个热同学的SFZ
号锁定在如下范围,
首先西藏拉萨人,我们的在某搜索引擎搜索西藏拉萨市的SFZ
号前六位可以看到是540100
,这样我们确定了前六位。
其次99年的妹子,生日是9月13日,自然接下来就是19990913
而根据某订票软件的截图可以看到最后3位是789
这样,SFZ
号的大致范围可以确定为540100 19990912 *789
为什么可以这样确定呢?这里给大家科普一下我国二代SFZ
号的组成
- 号码的结构:公民
SFZ
码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码, - 地址码:表示编码对象常住户口所在县(县级市、旗、区)的行政区划代码,按GB/T2260的规定执行。
- 出生日期码:表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日代码之间不用分隔符。
- 顺序码:表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。
- 校验码:根据前面十七位数字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的检验码。
这样就可以理解为什么可以确定为540100 19990913 *789
这个范围
2.在树莓派上用python生成所有可能的SFZ
号码
2.1生成未知的数字
显然未知的一位可能是0-9中的任意数字,我们用
range(10)
生成一个从0到9的十个整数构成的list
2.2通过pythonSFZ
校验库校验来缩小范围
我们可以知道未知数字有10
种可能性,这显然不能确定范围,因此我们用到id_validator
这个库来校验这10组SFZ
号码
id_validator
这个python
库是居民身份证号码验证工具(Python
版)支持15
位与18
位号码。仅支持Python 3
我们首先在树莓派上安装id_validator
,在树莓派终端输入:
pip3 install id-validator
安装成功后新建一个python
程序,在树莓派终端输入:
sudo nano id.py
在nano文本编辑器内添加如下代码:
# -*- coding: utf-8 -*-
import time
from id_validator import validator
for i in range(10):
if validator.is_valid('54010019990913' + str(i) + '789'):
print('热娜娅的身份证号:' + '54010019990913' + str(i) + '789')
然后Ctrl+X
退出,按Y
保存
在树莓派终端运行此程序,注意使用python3
运行:
python3 id.py
运行结果如图:
运行结果显然符合校验码的最后一位未知数字是6
这样我们就成功推算出了热娜娅的SFZ
号码540100 19990913 6789
3.一个小彩蛋
校验库id-validator
还有另外一功能,
print(validator.get_info('540100199909136789'))
自动生成所在地、生日、星座、属相、性别、校验码等相关信息,如下图:
具体信息