美文网首页Python小哥哥
使用Python实现根据指定的出生日期自动生成测试身份证号码的方

使用Python实现根据指定的出生日期自动生成测试身份证号码的方

作者: 晓风大神 | 来源:发表于2020-03-19 08:51 被阅读0次
    1、身份证号码结构简介
    1.号码的结构

    公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。

    2.地址码

    表示编码对象常住户口所在县(县级市、旗、区)的行政区划代码,按GB/T2260的规定执行。

    3.出生日期码

    表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日代码之间不用分隔符。

    4.顺序码

    表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。

    5.校验码

    根据前面十七位数字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的检验码。

    2、身份证号码尾号算法示例

    比如身份证号码前17位为:11011119900203123

    第一步、将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 ,并且将这17位数字和系数相乘的结果相加

    例如:1x7+1x9+0x10+1x5+1x8+1x4+1x2+9x1+9x6+0x3+0x7+2x9+0x10+3x5+1x8+2x4+3x2 = 153

    第二步、用加出来和除以11,看余数是多少;

    例如:153 / 11 = 13余10,余数为10

    第三步、余数只可能有0 1 2 3 4 5 6 7 8 9 10这11个数字。其分别对应的最后一位身份证的号码为1 0 X 9 8 7 6 5 4 3 2;

    例如:上一步中的余数为10,我们的校验位就是:2

    所以,身份证号码为:11011119900203123

    用我之前写的校验工具校验一下,确认无误:

    1584436953604.png
    3、全代码

    我们要实现的功能:输入出生年月日,自动随机生成一个身份证号码;

    # -*- coding: utf-8 -*-
    # @Time    : 2020/3/17 17:29
    # @Author  : felix
    # @File    : idNumber.py
    # @Software: PyCharm
    
    import random
    
    #预设地区:
    codelist = ["110101","110102","110105","110106","110107","420117","420200","420202","420203","420204","420205","420222"]    #随便设置了几个地区,基本都是湖北和北京的;
    weight = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2] #权重项
    checkcode ={'0':'1','1':'0','2':'X','3':'9','4':'8','5':'7','6':'6','7':'5','8':'5','9':'3','10':'2'} #校验码映射
    
    def newIdNum(birthyear,birthmonth,birthday):
        #身份证前6位
        try:
            id = codelist[random.randint(0,len(codelist))] #地区项
        except:
            id = "110101"
    
        #7-10位,出生年份
        try:
            birthdayStr = str(birthyear).zfill(4)+str(birthmonth).zfill(2)+str(birthday).zfill(2)
            id = id + birthdayStr
        except:
            id = id + "19900101"
    
        #最后4位的随机前3位
        sex = ""
        try:
            sign = random.randint(1,999)
            if sign%2 == 0:
                sex = "女"
            else:
                sex = "男"
            id = id + str(sign).zfill(3) #顺序号简单处理
        except:
            id = id + "999"
        #判断性别
    
        sum_1 = 0
        for a in range(17):
            sum_1 = sum_1+int(id[a])*weight[a]
        index_id = sum_1%11
        result_id = id + str(checkcode[str(index_id)])  #最终号码
        return (result_id,sex)
    
    if __name__ == '__main__':
        birthyear = input("请输入出生年(例如:1990): ")
        birthmonth = input("请输入出生月(例如:10): ")
        birthday = input("请输入出生日(例如:2): ")
        (id,sex) = newIdNum(birthyear,birthmonth,birthday)
        print("身份证号码为:%s,性别:%s" %(id,sex))
    

    测试输出:

    请输入出生年(例如:1990): 1989
    请输入出生月(例如:10): 12
    请输入出生日(例如:2): 13
    身份证号码为:320200198912135760,性别:女
    
    Process finished with exit code 0
    
    请输入出生年(例如:1990): 2010
    请输入出生月(例如:10): 12
    请输入出生日(例如:2): 3
    身份证号码为:420117201012031026,性别:女
    
    Process finished with exit code 0
    

    相关文章

      网友评论

        本文标题:使用Python实现根据指定的出生日期自动生成测试身份证号码的方

        本文链接:https://www.haomeiwen.com/subject/rqkkyhtx.html