身份证号码校验算法(附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 

相关文章
相关标签/搜索