树莓派玩转树莓派Za

我竟然用树莓派+python算出了兄弟苦苦追求的女神SFZ号!

2020-03-09  本文已影响0人  老鱼匠

0.事情的起因

我发小大学里遇到了他的梦中情人——热娜娅

两年的相处,从慢慢接触到熟悉起来两个人已经成为好朋友,

发小的表白计划也提上日程

但他遇到一个问题使他表白计划一拖再拖

问过之后才知道是因为不知道女神的SFZ号码,他需要两个人的SFZ号来做成一件有意义的礼物

作为一个为女人插兄弟两刀的......咳咳......为兄弟两肋插刀当代新青年

主动揽下了这个重任

1.信息的收集

我向他收集了关于女神的一些信息。

他陆陆续续给我提供了如下信息,女神热娜娅是西藏拉萨人,是一个99年的妹子,生日是9月13日,两人一起做过动车,是他订的票,在订票App上输入过SFZ号,可是当他把截图发给我时候却只有下面的部分:

订票截图

根据他提供给我的全部信息,我大致把这个热同学的SFZ号锁定在如下范围,

首先西藏拉萨人,我们的在某搜索引擎搜索西藏拉萨市的SFZ号前六位可以看到是540100,这样我们确定了前六位。

其次99年的妹子,生日是9月13日,自然接下来就是19990913

而根据某订票软件的截图可以看到最后3位是789

这样,SFZ号的大致范围可以确定为540100 19990912 *789

为什么可以这样确定呢?这里给大家科普一下我国二代SFZ号的组成

  1. 号码的结构:公民SFZ码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,
  2. 地址码:表示编码对象常住户口所在县(县级市、旗、区)的行政区划代码,按GB/T2260的规定执行。
  3. 出生日期码:表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日代码之间不用分隔符。
  4. 顺序码:表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。
  5. 校验码:根据前面十七位数字码,按照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'))

自动生成所在地、生日、星座、属相、性别、校验码等相关信息,如下图:

具体信息

以上所涉及人物及SFZ号纯属虚构,为随机生成的假数据,如撞车,请联系删除。文章涉及技术为真。

上一篇下一篇

猜你喜欢

热点阅读