根据身份证10位号码推测出生日期
来源:互联网 发布:单片机的外部复位电路 编辑:程序博客网 时间:2024/05/17 23:25
看到有人说,身份证号码最后一位不是随机数也不代表性别,而是和前17位数字相关,作为身份证号码是否合法的标志检测位。于是突发奇想,有的时候为保密起见,身份证号码不会完全公布,但会公布除过出生日期的其余十位号码,在此条件下,能不能大致推测一下可能的出生日期?如果再知道出生的年份范围,就可以以很高置信度得到若干个预测出生日期。用python实现了一下,具体代码如下。
# coding:utf-8"""#----------------------------------------------------------------------------------------# 功能:根据身份证号中除去出生日期后的10位号码推测出生日期# 18位身份证号码中,最后一位数字是一个校验位,和前17位有关,具体可百度了解# 17位身份证号码每一位对应权值: 7 9 10 5 8 4 | 2 1 6 3 | 7 9 10 5 | 8 4 2# 17位号码加和取余结果对应数字:0 1 2 3 4 5 6 7 8 9 10 -> 1 0 X 9 8 7 6 5 4 3 2#----------------------------------------------------------------------------------------"""print(__doc__)# 要预测的身份证号码,例如 110111199202064215 去掉其中的出生日期后共有10位IDraw = '1101114215'ID = int(IDraw[:-1])startYear, endYear = int(raw_input("请输入起始年份(例如,2000):")),\ int(raw_input("请输入截止年份(例如,2010):"))monthDic = {1:31, 3:31, 4:30, 5:31, 6:30, 7:31, 8:31, 9:30, 10:31, 11:30, 12:31}lastNumDic = {0:'1', 1:'0', 2:'X', 3:'9', 4:'8', 5:'7', 6:'6', 7:'5', 8:'4', 9:'3', 10:'2'}# 将10位身份证号码分离得到每一位def IDtoList(ID): result = [] #按从最低位(个位)到最高位的顺序获取每位数字 while ID: result.append(ID % 10) ID = ID / 10 result.reverse() return resultIDarray = IDtoList(ID)# 判断是否为闰年def RunYear(year): if (year % 4) == 0: if (year % 100) == 0: if (year % 400) == 0: RunYear = 1 # 整百年能被400整除的是闰年 else: RunYear = 0 else: RunYear = 1 # 非整百年能被4整除的为闰年 else: RunYear = 0 return RunYear# 10位数字之和IDsum1 = IDarray[0]*7 + IDarray[1]*9 + IDarray[2]*10 + IDarray[3]*5 + IDarray[4]*8 + IDarray[5]*4 + \ IDarray[6]*8 + IDarray[7]*4 + IDarray[8]*2for year in range(startYear, endYear +1): # 年 if(RunYear(year)): # 判断闰年和平年,得到二月份天数 monthDic[2] = 29 else: monthDic[2] = 28 for month in range(1,13): # 月 for day in range(1,monthDic[month]+1): # 日 # 17位数字加权总和 IDsum2 = IDsum1 + year/1000*2 + year%1000/100*1 + year%1000%100/10*6 + year%1000%100%10*3 + \ month/10*7 + month%10*9 + day/10*10 + day%10*5 IDsumLast = IDsum2 % 11 if str(lastNumDic[IDsumLast]) == IDraw[-1]: # 输出满足要求的出生日期 print (year,month,day)
找到4条身份证信息测试了一下,实验结果和预期完全相符,能正确得到出生日期。具体结果如下。
0 0
- 根据身份证10位号码推测出生日期
- 根据身份证获取出生日期
- oracle根据身份证更新出生日期(15位与18位身份证都可)
- JavaScript中根据身份证求出出生日期的正则表达式(各位给评评!(包含原来15位的))
- 根据身份证获出生日期和性别---含C#代码
- js根据输入身份证信息带出出生日期,年龄,性别
- 将身份证的位号码升级为位
- 将身份证的15位号码升级为18位
- 身份证、出生日期、年龄转换
- 身份证出生日期校验
- mysql 截取身份证出生日期
- 根据身份证号码计算出生日期、年龄、性别(18位)
- 15位和18位身份证提取出生日期,性别和城市代码
- 18位号码身份证校验码的计算公式
- 18位号码身份证校验码的计算公式(c++)
- 18位号码身份证校验码的计算公式(c++)
- 使用JS 校验15或18位身份证的合法性以及得到所属地区,出生日期,性别
- 匹配身份证,并提取出生日期
- 【JS】输入框内容传递给另一个输入框,测试通过
- Redis监控和告警
- ZWAVE Door Lock Logging Records
- 18、Java入门—Java IO流之对象的序列化和反序列化
- 移动端实现排序拖动
- 根据身份证10位号码推测出生日期
- C++ 官网的例子,可变参数的函数
- C#转发邮件
- 完全卸载mysql数据库图文教程
- Qt for ARM_Linux环境搭建-Qt5.7+iTop4412嵌入式平台移植
- 年终技术盛会筹备中 SDCC 2016正公开征集演讲嘉宾
- bootstarp-sass
- 修改状态栏以及navgationController标题颜色
- [JS] JavaScript 介绍