文档章节

身份证号码校验算法(附Python代码)

j_hao104
 j_hao104
发布于 2016/10/10 12:55
字数 673
阅读 1419
收藏 3

1、数字含义

    中国大陆第二代身份证号码由18位数据或字母组成,每位数据都有特定的含义,结果如下:

 每组数字都有不同的含义:

    1) 第1至2位数字代表所在省(直辖市、自治区)的代码;

    2) 第3至4位数字代表所在地级市(自治州)的代码;

    3) 第5至6位数字代表所在区(县、自治县、县级市)的代码;

    4) 第7-14位数字代表出生年、月、日;

    5) 第15-16位数字代表所在的派出所代码;

    6) 第17位数字表示性别,奇数表示男性,偶数表示女性;

    7) 第18位是校验码,及个人信息码,由前17位数字计算得到。

    也就是说身份证号码不是随便产生的,它是用来检验身份的正确性。在没有全国个人身份证信息库时。可以通过检验码来校验身份证的正确性。校验码由0-9的数据和字母X组成,其实X表示10(这并不是英文字母X,而是希腊数字10的缩写)。是由号码编制单位按统一的计算公式计算出来的,校验身份证号码正确性也是通过这个公式实现。

 

2、算法介绍

    首先,对前17位信息数字按照特定的方式加权,公式如下:

    即各位置的数字和权重的乘积之和,权重计算公式说明:例如位置18(即第一位数字)的权重应该是2的17次方的结果对11取余。

    计算出S后再用S对11取余,根据余数确定校验位数字,对照表如下:

    比如例子中的身份证号计算出来的S为189,对11取余结果为2,查表2对应的校验码为X,所以该身份证号最后一位应该为X。

 

3、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 

 

© 著作权归作者所有

j_hao104

j_hao104

粉丝 216
博文 71
码字总数 111997
作品 2
成都
程序员
私信 提问
分分钟几万上下!用Python爬取包图网视频(附代码)切勿商用!

分析网页数据结构 目标抓取全站视频数据保存在本地, 并以网站视频名命名视频文件。 经分析我们可以发现总站数据 我们可以从这四这选项下手 分析网页数据格式 网页数据为静态 抓取下一页链接...

Python新世界
2018/07/24
0
0
利用Python打造一个多人在线匿名聊天的小程序!(前后端完整开发)

最近看到好多设计类网站, 都提供了多人在线匿名聊天的小功能, 感觉很有意思, 于是自己就用django框架写了一个, 支持手动实时更名, 最下方提供了完整的源码. 在线聊天(不需要登录,开一个窗口,...

Python新世界
2018/07/25
0
0
D05——C语言基础学PYTHON

C语言基础学习PYTHON——基础学习D05 20180815内容纲要:     1 模块     2 包     3 import的本质     4 内置模块详解       (1)time&datetime       (2)d...

m1racle
2018/08/16
0
0
13行代码实现:Python实时视频采集(附源码)

13行代码实现:Python实时视频采集(附源码) 一、前言 本文是《人脸识别完整项目实战》系列博文第3部分:程序设计篇(Python版),第1节《Python实时视频采集程序设计》,本章内容系统介绍:...

优惠码领取
04/08
0
0
【机器学习-分类】一句话+一张图说清楚 Logistic回归 算法(附案例+代码)

版权声明:欢迎转载,转载请注明出处:土豆洋芋山药蛋 https://blog.csdn.net/qq_33414271/article/details/87366838 说在前面 同一个算法本身存在各种不同的变体,即各种改进版本。一句话+...

土豆洋芋山药蛋
02/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

程序设计基础(C)第06讲例程

1summing.c /* summing.c -- 根据用户键入的整数求和 */#include <stdio.h>int main(void){ long num; long sum = 0L; /* 把sum 初始化为0 */ int status; p......

树人大学数字媒体吴凡
7分钟前
3
0
聊聊nacos config的publishConfig

序 本文主要研究一下nacos config的publishConfig ConfigController nacos-1.1.3/config/src/main/java/com/alibaba/nacos/config/server/controller/ConfigController.java @Controller@R......

go4it
35分钟前
3
0
Eureka应用注册与集群数据同步源码解析

在之前的EurekaClient自动装配及启动流程解析一文中我们提到过,在构造DiscoveryClient类时,会把自身注册到服务端,本文就来分析一下这个注册流程 客户端发起注册 boolean register() t...

Java学习录
44分钟前
11
0
Java描述设计模式(15):责任链模式

本文源码:GitHub·点这里 || GitEE·点这里 一、生活场景描述 1、请假审批流程 公司常见的请假审批流程:请假天数 当 day<=3 天,项目经理审批当 3<day<=5 天,部门经理审批当 day>5 天...

知了一笑
55分钟前
10
0
总结:数组与链表

1、内存申请:数组在内存上是连续的空间;链表,内存地址上可以是不连续的。 2、查询速度:数组可以随机访问,链表必须顺序访问,即从首个元素开始遍历,逐个查找,所以数组查询很快。 3、写入...

浮躁的码农
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部