身份证号生成,校验码计算
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了身份证号生成,校验码计算相关的知识,希望对你有一定的参考价值。
二代身份证号有18位,组成是: 6位地区码+8位出生年月日+3位顺序码+1位校验码
其中,校验码计算如下图,本范例按照红色计算方向走
第一步骤就是映射权重;第二步骤是求积;第三步骤相加求余;最后一个步骤就是查找码表得出最后1位字符
红色方向数字更小,计算更快。
import random
import time
# 地区区域码,此范例只列出3位
areas = (‘610622‘, ‘410901‘, ‘321281‘, ‘350581‘)
# 身份证前17位权重
w17 = (7, 9, 10, 5, 8,
4, 2, 1, 6, 3,
7, 9, 10, 5, 8,
4, 2)
# 校验位字典
crc_dict = {0: ‘1‘, 1: ‘0‘, 2: ‘X‘, 3: ‘9‘, 4: ‘8‘, 5: ‘7‘, 6: ‘6‘, 7: ‘5‘, 8: ‘4‘, 9: ‘3‘, 10: ‘2‘}
# 生成身份证号码
def create_zjhm():
while True:
# 6位数字区域
zjhm = random.choice(areas)
# 8位数字出生年月
t_start = time.mktime((1970, 1, 1, 9, 0, 0, 0, 0, 0))
t_end = time.mktime((1995, 1, 1, 9, 0, 0, 0, 0, 0))
random.randrange(start=t_start, stop=t_end)
zjhm += time.strftime(‘%Y%m%d‘, time.gmtime(random.randrange(t_start, stop=t_end)))
# 3位数字顺序
zjhm += ‘%03d‘ % random.randrange(start=0, stop=999)
# 1位校验位, 根据前面17位号码,计算最后一个校验位,也可用于身份证校验
# 乘以权重之后求和,最后除以11求余
crc = sum(map(lambda z: z[0]*z[1], zip(w17, [int(i) for i in zjhm]))) % 11
# 根据余数映射字符
crc = crc_dict.get(crc)
if not crc:
time.sleep(1)
continue
zjhm += crc
if not zjhm or len(zjhm) != 18:
time.sleep(1)
continue
return zjhm
if __name__ == ‘__main__‘:
print(create_zjhm())
尝试计算结果如下,每次身份证号码随机
610622198009132706
410901198206105966
61062219800922634X
Process finished with exit code 0
以上是关于身份证号生成,校验码计算的主要内容,如果未能解决你的问题,请参考以下文章