证件号码规则:
18位身份证号码:1~6位:地址码,7~14位:生日码,15~17位:顺序码,18位:校验码。
地址码:1-2位代表:省、自治区、直辖市、特别行政区。3-4位代表:市、地区、自治州、盟、直辖市所辖市辖区/县汇、省(自治区)直辖县级行政区。5-6位代表:县、自治县、县级市、旗、自治旗、市辖区、林区、地区辖特区。 具体数值可以参考《中华任命共和国行政区划代码(GB T2260)》。
生日码:以YYYYMMDD格式代表。
顺序码:表示同一地区对同年同月同日生的人编定的顺序号,其中:奇数分配给男性,偶数分配给女性。也就是说身份证号码第17位的奇偶数代表了性别。
校验码:
1、将身份证前17位数分别乘以以下对应的17个系数: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
2、将17位数与上述的系数相乘,然后相加求和。
3、将所得的和除以11,获得余数。
4、余数为0~10这11个数中的一个,0~10 分别对应为 1 0 X 9 8 7 6 5 4 3 2。 所以,如果余数是2,身份证最后一位就是罗马数字X;如果余数是3,身份证最后一位就是9。
15位身份证号码各位的含义:
1、1-2位省、自治区、直辖市代码;
2、3-4位地级市、盟、自治州代码;
3、5-6位县、县级市、区代码;
4、7-12位出生年月日,YYMMDD格式代表,比如670401代表1967年4月1日,与18位的第一个区别;
5、13-15位为顺序号,其中15位男为单数,女为双数;
def createID():
#创建地址码列表
str1_6 = ["110101", "150422", "120101", "130101", "330101", "440101", "440113", "441201",
"340101", "340201", "450101", "150101", "150401", "150423", "150602", "150801",
"152501", "152921", "370729", "370728"]
#创建年份前三位列表
str7_9 = ["195", "196", "197", "198"]
#创建身份证前17位数对应的17个系数
coefficientArray = ["7", "9", "10", "5", "8", "4", "2", "1", "6", "3", "7", "9", "10", "5", "8", "4", "2"]
#创建校验码列表
MapArray = ["1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"]
#随机年份的最后一位
str10 = str(randint(1, 9))
#随机月份,单数字用zfill方法在前面补0
str11_12 = str(randint(1, 12)).zfill(2)
#随机日
str13_14 = str(randint(1, 27)).zfill(2)
#随机一个3位随机码(不区分性别)
str15_17 = str(randint(1, 999)).zfill(3)
#随机地址码的一个位置,用来取地址码,由于列表是从0开始的所以要减1,用len是为了随时获取列表的长度
m = randint(0, len(str1_6) - 1)
#随机年份前三位列表的一个位置
n = randint(0, len(str7_9) - 1)
#拼接起来前17位
tempStr = str1_6[m] + str7_9[n] + str10 + str11_12 + str13_14 + str15_17
total = 0
#循环17位长度,取出每一位去乘对应的系数加起来的和放到total里面
for i in range(len(tempStr)):
total = total + int(tempStr[i]) * int(coefficientArray[i])
#循环结束后获得每个字段乘系数的和后除以11的余,再从校验码列表取到余对应的码值
parityBit = MapArray[total % 11]
#拼接前17位加校验码合并成完整的18位证件号
ResultIDCard = tempStr + parityBit
return ResultIDCard
{/collapse-item}
{collapse-item label="Python代码实现身份证18位15位互转"}
# -*- coding: utf-8 -*-
# 有时候你得多想想
# @Created:
# @Time: 2021/12/8 16:47
def cer_no(old_no):
old_no = str(old_no)
if len(old_no) == 18:
new_no = old_no[0:6] + old_no[8:17]
elif len(old_no) == 15:
coefficientArray = ["7", "9", "10", "5", "8", "4", "2", "1", "6", "3", "7", "9", "10", "5", "8", "4", "2"]
MapArray = ["1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"]
tempStr = old_no[0:6] + '19' + old_no[6:15]
total = 0
for i in range(len(tempStr)):
total = total + int(tempStr[i]) * int(coefficientArray[i])
parityBit = MapArray[total % 11]
ResultIDCard = tempStr + parityBit
new_no = ResultIDCard
else:
new_no = '非18位或者15位证件号不能转换,请确认证件号码位数!!!'
return new_no
{/collapse-item}
评论 (0)