码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2017-04-19 00:31:10      阅读:402      评论:0      收藏:0      [点我收藏+]

标签:ret   stop   random   creat   code   dom   time   zip   roc   

二代身份证号有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

 

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

标签:ret   stop   random   creat   code   dom   time   zip   roc   

原文地址:http://www.cnblogs.com/inns/p/6731236.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!