python 自动批量生成sfz号
本文内的内容均仅限于学习交流,请勿作恶!
首先是一点小科普
sfz号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码
所以只有后四位是不确定的
sfz校验码
sfz号码中的校验码是sfz号码的最后一位,是根据GB 11643-1999中有关公民身份号码的规定,根据精密的计算公式计算出来的,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码,最后一位是数字校验码。
计算方法:
将前面的sfz号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 ;
sfz第_位 | 第1位 | 第2位 | 第3位 | 第4位 | 第5位 | 第6位 | 第7位 | 第8位 | 第9位 | 第10位 | 第11位 | 第12位 | 第13位 | 第14位 | 第15位 | 第16位 | 第17位 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
系数 | 7 | 9 | 10 | 5 | 8 | 4 | 2 | 1 | 6 | 3 | 7 | 9 | 10 | 5 | 8 | 4 | 2 |
将乘出的结果相加并除11取余,只能得到0-10共11个数字,分别对应的最后一位sfz的号码为1 0 X 9 8 7 6 5 4 3 2
余数 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|
相对于的结尾 | 0 | x | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
所以生成后四位和前面固定的十四位组到一起即可
以下直接是成品:
list=[7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
list_len=len(list)
last_number_list=['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']
def check():
known_num=input("已知的sfz号,根据户籍地区查前六位,根据出生年月日确定中间八位:")
for unknown_num in range(0,1000):#生成倒数第4-2位
unknown_num_len=len(str(unknown_num))
if unknown_num_len == 1:#不满足三位时填两个0
ID_number=known_num+"00"+str(unknown_num)
elif unknown_num_len == 2:#不满足三位时填一个0
ID_number=known_num+"0"+str(unknown_num)
else:
ID_number=known_num+str(unknown_num)
sum=0
digs=ID_number
for i in range(17):
multiplier=list[i]
product = int(digs[i]) * multiplier
sum=sum+product
remainder = sum %11
check_number=last_number_list[remainder]
print(ID_number+str(check_number))
start=check()
本文出自于 https://www.cnblogs.com/tharsis/ 转载请注明出处。