原理
校验算法有标准,叫ISO 7064:1983.MOD 11-2
,这里简述下方法
计算方法
1. 加权求和
前17位分别与如下数相乘,然后相乘结果相加,得到一个总数num
[7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2]
2. 取模运算
ps. 取模运算是求两个数相除的余数。
将对上面的结果num
对11取模,得到modNum
用代码可以表示成这样:
代码语言:javascript复制modNum = num
3. 将取模结果转换为校验码
取模会得到一个0到10的整数,他们分别对应下面的校验码:
代码语言:javascript复制["1","0","X","9","8","7","6","5","4","3","2"]
注意从0开始,也就是取模结果为
0
校验码为1
、取模结果为2
校验码为X
,以此类推
代码
代码语言:javascript复制# 放入前17位身份证号,计算末尾校验码
def Calculate_CheckCode(idNumTop17:str):
weight = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2]
checkCodeList = "10X98765432"
index = 0
num = 0
for n in idNumTop17:
num = num int(n)*weight[index]
index = index 1
return checkCodeList[num]
# 校验18位身份证号合法性
def VerifyLegality(idNum:str):
idNum = idNum.upper()
if Calculate_CheckCode(idNum[:-1]) == idNum[-1]:
return True
else:
return False