
第二代号由18位数字组成校验码不对,由6位区号+ 8位出生日期+ 3位序列号+ 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 += ‘d‘ % 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
进程退出代码为0
号码生成,验证码计算
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-274262-1.html
我若动手
最爱的女神和最爱的男神配戏啦