身份證號碼校驗算法(附Python代碼)

一、數字含義

    中國大陸第二代身份證號碼由18位數據或字母組成,每位數據都有特定的含義,結果以下:html

 每組數字都有不一樣的含義:python

    1) 第1至2位數字表明所在省(直轄市、自治區)的代碼;算法

    2) 第3至4位數字表明所在地級市(自治州)的代碼;spa

    3) 第5至6位數字表明所在區(縣、自治縣、縣級市)的代碼;.net

    4) 第7-14位數字表明出生年、月、日;code

    5) 第15-16位數字表明所在的派出所代碼;htm

    6) 第17位數字表示性別,奇數表示男性,偶數表示女性;blog

    7) 第18位是校驗碼,及我的信息碼,由前17位數字計算獲得。get

    也就是說身份證號碼不是隨便產生的,它是用來檢驗身份的正確性。在沒有全國我的身份證信息庫時。能夠經過檢驗碼來校驗身份證的正確性。校驗碼由0-9的數據和字母X組成,其實X表示10(這並非英文字母X,而是希臘數字10的縮寫)。是由號碼編制單位按統一的計算公式計算出來的,校驗身份證號碼正確性也是經過這個公式實現。class

 

二、算法介紹

    首先,對前17位信息數字按照特定的方式加權,公式以下:

    即各位置的數字和權重的乘積之和,權重計算公式說明:例如位置18(即第一位數字)的權重應該是2的17次方的結果對11取餘。

    計算出S後再用S對11取餘,根據餘數肯定校驗位數字,對照表以下:

    好比例子中的身份證號計算出來的S爲189,對11取餘結果爲2,查表2對應的校驗碼爲X,因此該身份證號最後一位應該爲X。

 

三、Python代碼

def checkIDNumber(num_str):
    str_to_int = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5,
                  '6': 6, '7': 7, '8': 8, '9': 9, 'X': 10}
    check_dict = {0: '1', 1: '0', 2: 'X', 3: '9', 4: '8', 5: '7',
                  6: '6', 7: '5', 8: '4', 9: '3', 10: '2'}
    if len(num_str) != 18:
        raise TypeError(u'請輸入標準的第二代身份證號碼')
    check_num = 0
    for index, num in enumerate(num_str):
        if index == 17:
            right_code = check_dict.get(check_num % 11)
            if num == right_code:
                print(u"身份證號: %s 校驗經過" % num_str)
            else:
                print(u"身份證號: %s 校驗不經過, 正確尾號應該爲:%s" % (num_str, right_code))
        check_num += str_to_int.get(num) * (2 ** (17 - index) % 11)
if __name__ == '__main__':
    num_str1 = '34052419800101001X'
    num_str2 = '340524198001010011'
    checkIDNumber(num_str1)
    checkIDNumber(num_str2)

參考:

http://jingyan.baidu.com/article/72ee561abd962fe16038df48.html 

 

轉載請註明來源:https://my.oschina.net/jhao104/blog/756241 

相關文章
相關標籤/搜索