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

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实现根据指定的出生日期自动生成测试身份证号码的方法)