我用python算出了同事的身份证号码!

作者:朱小五

来源:凹凸玩数据

事情的经过是这样的:

我的同事李大伟最近出差去了。

昨晚睡觉前翻了翻朋友圈,

就跟他愉快地 互怼 交流了起来。

估计是他想起了我朱小五从不打无把握之赌,后面就怂了。

一杯奶茶嘛,也可以接受,

像杰伦一样快乐就好啦。

开工。

先看看李大伟的朋友圈中发的图片。

(该火车票来自其他平行世界,扫描可能发生奇怪现象)

车票中暴露的个人信息为:

3302211993****4914 李大伟

只缺少月份日期四位。

那么也就是一共365种可能。

科普时间:

根据李大伟的身份证信息的前6位“330221”

轻易可得:

浙江省宁波人,1993年滴

那我先用python生成1993年的所有日期吧

import time
#生成出生当年所有日期
def dateRange(year):
    fmt = ‘%Y-%m-%d‘
    bgn = int(time.mktime(time.strptime(year+‘-01-01‘,fmt)))
    end = int(time.mktime(time.strptime(year+‘-12-31‘,fmt)))
    list_date = [time.strftime(fmt,time.localtime(i)) for i in range(bgn,end+1,3600*24)]
    return [i.replace(‘-‘,‘‘) for i in list_date]
data_time  = dateRange(‘1993‘)

成功得到日期列表。

再用刚才的校验码计算规则

反向验证哪个日期符合喽!

自己写计算规则?

NONONO,太麻烦!

给大家隆重介绍一个库: id-validator

安装:pip install id-validator

可以用来验证身份证号合法性、获取身份证号信息、生成可通过校验的假数据、身份证升级。

那么我们利用 id-validator 来依次校验刚才生成的身份证号码。

from id_validator import validator
#遍历所有日期,print通过校验的身份证号码
def vali_dator(id1,id2,id3):
    for i in dateRange(id2):
        theid = id1 + i + id3
        if validator.is_valid(theid):
            print(theid)
vali_dator(‘330221‘,‘1993‘,‘4914‘)

运行结果:

有33个都符合校验逻辑,这只筛掉了90%啊

这就尴尬了

如何在33个日期中挑出来李大伟的真实出生日期呢?

思考了一下

(其实是百度了一波)

这里需要我们每个人都用过的12306。

打开12306官网,

在12306添加常用联系人,

将李大伟+身份证号依次输入。

若身份证和姓名一致,就会显示校验通过;

若不能通过,则说明身份证和姓名不一致。

最终可以测出李大伟的出生日期是:19930608

收工,

奶茶到手。

大家是不是想知道我到底试了多少次才成功的?

刚刚回来的李大伟也表示很想知道。

其实一次也没用试。

现在我喝着李大伟买的奶茶

码着文

打开钉钉

看着李大伟的昵称

心里笑出猪叫。

文中人物、身份证号码纯属虚构,如有雷同,就是抄我的。

很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。

很多已经做案例的人,却不知道如何去学习更加高深的知识。

那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!

QQ群:127341871

原文地址:https://www.cnblogs.com/qdsn/p/11727569.html

时间: 2024-10-13 09:05:42

我用python算出了同事的身份证号码!的相关文章

javascript基础程序(算出一个数的平方值、算出一个数的阶乘、输出!- !- !- !- !- -! -! -! -! -! 、函数三个数中的最大数)

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <script> /* 算出一个数的平方值 function add(a){ var b=Math.sqrt(a); return b; } alert(add(3));*/ /*// 算出一个数的阶乘 func

一次 Oracle 算出运算溢出问题 排查解决 (并非除数为零!)

前段时间 出现过这个问题,: 表中有一列为number类型 rec_recordlength (两个时间的间隔长度/秒) 部分数据 统计这个字段就会出现 "算出运算溢出" 错误,很是头疼,找不出原因 然后 今天又出现了, 然后不断排查,排查,发现是有一条数据导致的, 后来 这条数据删除重新插入就好了, 然后想到唯一动过这条数据的,是执行了rec_recordlength的更新,动作如下: update V_recordlogs set rec_recordlength=86400*(r

Java中用最有效率的方法算出2 乘以8 等於几?

Java中用最有效率的方法算出2 乘以8 等於几?2 << 3,因为将一个数左移n 位,就相当于乘以了2 的n 次方,那么,一个数乘以8 只要将其左移3 位即可,而位运算cpu 直接支持的,效率最高,所以,2 乘以8 等於几的最效率的方法是2 << 3.

【BioCode】删除未算出PSSM与SS的蛋白质序列

代码说明: 由于一些原因(氨基酸序列过长),没有算出PSSM与SS,按照整理出来的未算出特征的文件,删除原来的蛋白质序列: 需删除的氨基酸文件732.txt(共732条氨基酸): 删除前 氨基酸共25103*2=50206列 删除后 氨基酸共50206-732*2=48742列 代码如下: #include<stdio.h> #include<stdlib.h> #include<iostream> #include<string.h> #include&l

Python弹出MessageBox

ctypes import ctypes ctypes.windll.user32.MessageBoxW(0, u'内容', u'标题',0) 通过ctypes直接调用windows的API. 这种方法的好处是不用安装第三方的库,自给自足. pywin32 import win32api,win32con win32api.MessageBox(0,u'内容', u'标题' ,win32con.MB_OK) win32api是对windows API的封装,用到的常量都封装在win32con里

9.9递归和动态规划(十一)——算出有几种括号的放法可使该表达式得出result值

/** * 攻略:给定一个布尔表达式,由0.1.&.|和^等符号组成,以及一个想要的布尔结果result,实现一个函数,算出有几种括号的放法可使该表达式 * 得出result值. */ 两种方法: 方法一: /** * 思路:迭代整个表达式,将每个运算符当作第一个要加括号的运算符. * @param exp * @param result * @param s:start * @param e:end * @return */ public static int f(String exp,boo

JavaScript如何根据当天算出前三天和后三天

经杨秀徐批准 中央军委颁发意见建设新型司令机关news 杨秀徐会见到北京述职的香港特首梁振英news 海军372潜艇官兵先进事迹报告会举行 杨秀徐作指示news 中央农村工作会议在京召开 李克强作重要讲话 张高丽出席news 全国政协副主席令计划涉嫌严重违纪接受组织调查 澳门回归15周年:杨秀徐视察驻澳门部队 <!DOCTYPE html> <head> <title>JavaScript如何根据当天算出前三天和后三天</title> <script

算出日期对应的是周几

>>> 1-场景:输入日期,算出日期那天是周几. 2-直接上代码~ ------------------------------------------------------ 如果哪位朋友有更好的方法,期待交流推荐~ ------------------------------------------------------ 个人微信公众订阅号:IT知更鸟 (欢迎关注~) 原文地址:https://www.cnblogs.com/itRobins-wx/p/8676420.html

给你IP地址让你算出掩码(点分十进制),子网地址,广播地址。

给你IP地址让你算出掩码(点分十进制),子网地址,广播地址. 像要算出IP地址的掩码,子网地址,广播地址,先要记住几点.1:IP地址(A B C 三类)属于有类地址.A类地址掩码8位,B类地址16位,C类地址24位. 2:二进制 和十进制的转换记住(128,64,32,16,8,4,2,1). 3:要知道要知道A B C类地址的数位是多少.A类0-126/B类128-191/C类192-223.记住不要能错. 我们先从二进制的运算说起,举例:192的二进制是多少呢?其实就向我上面说的二进制 和十