原理

校验算法有标准,叫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

用代码可以表示成这样:

modNum = num%11

3. 将取模结果转换为校验码

取模会得到一个0到10的整数,他们分别对应下面的校验码:

["1","0","X","9","8","7","6","5","4","3","2"]
注意从0开始,也就是取模结果为0校验码为1、取模结果为2校验码为X,以此类推

代码

# 放入前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%11]

# 校验18位身份证号合法性
def VerifyLegality(idNum:str):
    idNum = idNum.upper()
    if Calculate_CheckCode(idNum[:-1]) == idNum[-1]:
        return True
    else:
        return False
最后修改:2024 年 02 月 25 日
如果觉得我的文章对你有用,请随意赞赏