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.png3、全代码
我们要实现的功能:输入出生年月日,自动随机生成一个身份证号码;
# -*- 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
网友评论