Python計算身份證第18位(校驗碼)來判斷身份證是否輸入正確

Python計算身份證第18位(校驗碼)來判斷身份證是否輸入正確

前言

  1. 身份證編碼規則如下:根據〖中華人民共和國國家標準GB11643-1999〗中有關公民身份號碼的規定,公民身份號碼是特徵組合碼,由十七位數字本體碼和一位數字校驗碼組成。
  • 順序碼(身份證第十五位到十七位)是縣、區級政府所轄派出所的分配碼,每個派出所分配碼爲10個連續號碼,例如“000-009”或“060-069”,其中單數爲男性分配碼,雙數爲女性分配碼,如遇同年同月同日有兩人以上時順延第二、第三、第四、第五個分配碼。如:005的就是個男生,而且和他同年月日生的男生至少有兩個,他們的後四位是001*和003*。分配順序碼中“999、998、997、996”四個順序號分別爲男女性百歲以上老人專用的特定編號。
  • 校驗碼(身份證最後一位)是根據前面十七位數字碼,按照ISO7064:1983.MOD11-2校驗碼計算出來的檢驗碼。
  1. 從1999年10月1日起,全國實行公民身份證號碼制度,居民身份證編號由原15位升至18位。前6位爲地址碼;第七位至14位爲出生日期碼,此碼由6位數改爲8位數,其中年份用4位數表示;第15位至17位爲順序碼,取消了順序碼中對百歲老人使用的特定編號;第十八位爲校驗碼,主要是爲了校驗計算機輸入公民身份證號碼的前17位數字是否正確,其取值範圍是0至10,當值等於10時,用羅馬數字符X表示。

校驗碼計算方法

  1. 將前面的身份證號碼17位數分別乘以不同的係數。從第一位到第十七位的係數分別爲:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。
  2. 將這17位數字和係數相乘的結果相加。
  3. 用加出來和除以11,看餘數是多少?
  4. 餘數只可能有0-1-2-3-4-5-6-7-8-9-10這11個數字。其分別對應的最後一位身份證的號碼爲1-0-X-9-8-7-6-5-4-3-2。
  5. 通過上面得知如果餘數是2,就會在身份證的第18位數字上出現羅馬數字的Ⅹ。如果餘數是10,身份證的最後一位號碼就是2。

例如:某女性的身份證號碼是220202202002020022。我們要看看這個身份證是不是合法的身份證。
首先我們得出前17位的乘積和是98,然後用98除以11得出其餘數是10。最後通過對應規則就可以知道餘數10對應的數字是2。所以,可以判定這是一個合格的身份證號碼。

用Python實現

lis = list(input('請輸入身份證號碼:'))
ten = ['X', 'x', 'Ⅹ']
ID = ["10" if x in ten else x for x in lis]     #將羅馬數字Ⅹ和字母X替換爲10
W = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
Checkcode = [1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2]
sum = 0
for i in range(17):     #https://blog.zeruns.tech
    sum = sum + int(ID[i]) * W[i]
if Checkcode[sum % 11] == int(ID[17]):
    print('輸入正確')
else:
    print('輸入錯誤')

原文:https://blog.zeruns.tech/index.php/archives/301/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章