身份證號碼編碼方法及校驗算法

身份證號碼編碼方法及校驗算法

1 身份證號碼的字段構成:

  • 地址碼

    身份證前六位,表示戶口所在縣(市、旗、區)的行政區劃代碼。

  • 生日碼

    身份證第七至第十四位,表示出生的年、月、日。

  • 順序碼

    身份證十五到十七位,爲同一地址碼所標識的區域範圍內,對同年、月、日出生的人員編訂的順序號。其中第十七位奇數分給男性,偶數分給女性。

  • 校驗碼

    身份證最後一位,根據前面十七位數字碼,按照ISO7064:1983.MOD11-2計算出來的校驗碼。作爲尾號的校驗碼,是由號碼編制單位按統一的公式計算出來的,如果某人的尾號是0-9,都不會出現X,但如果尾號是10,那就用X替代,因爲如果用10作尾號,此人的身份證號碼就變成了19位,爲了身份證號碼數位的一致性,用羅馬字母X替代10。

2 校驗碼具體的計算方法

  • 將前面的身份證號碼17位數分別乘以不同的係數。第i位對應的數爲[2^(18-i)]mod11。從第一位到第十七位的係數分別爲:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 .

  • 將這17位數字和係數相乘的結果相加.

  • 用加出來的和除以11,看餘數是多少.

  • 餘數只可能有0 1 2 3 4 5 6 7 8 9 10這11個數字。其分別對應的最後一位身份證的號碼爲1 0 X 9 8 7 6 5 4 3 2;

  • 通過上面得知如果餘數是2,就會在身份證的第18位數字上出現羅馬數字的Ⅹ。如果餘數是10,身份證的最後一位號碼就是2.

3 Python實現校驗算法


def check_id_num(num):
    if len(num) != 18:
        return False
    if not num[:-1].isdigit():
        return False
    fact = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
    sum = 0
    for i in range(17):
        sum += fact[i] * int(num[i])
    m = sum % 11
    chk = '10X98765432'
    if chk[m] == num[-1]:
        return True
    else:
        return False
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章