身份证号生成,校验码计算

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

 













































以上是关于身份证号生成,校验码计算的主要内容,如果未能解决你的问题,请参考以下文章

身份证号的末位校验码算法最后一步模11是基于啥考虑?

校验身份证号+验证码校验(vue+element)

python身份证号换成***

java身份证号位数校验

java 验证身份证号

计算身份证校验码(最后一位)