二代身份证号有18位,组成是: 6位地区码+8位出生年月日+3位顺序码+1位校验码
其中,校验码计算如下图,本范例按照红色计算方向走
第一步骤就是映射权重;第二步骤是求积;第三步骤相加求余;最后一个步骤就是查找码表得出最后1位字符
红色方向数字更小,计算更快。
import randomimport 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
时间: 2024-12-29 11:40:31