根据身份证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
原创粉丝点击