身份证号码校验算法

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

转自:j_hao104的博客

https://my.oschina.net/jhao104/blog/756241

原文发布于微信公众号 - Crossin的编程教室(crossincode)

原文发表时间:2016-11-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏一名叫大蕉的程序员

大数据计数原理1+0=1这你都不会算(六)No.57

照例甩一波链接。 大数据计数原理1+0=1这你都不会算(一)No.47 <- HashSet 大数据计数原理1+0=1这你都不会算(二)No.5...

2096
来自专栏js编程在工科课程中的简单应用

5.1 一维导热算例

算例:一根长11m的铁棒,左侧温度100℃,右侧0℃,试计算其稳态温度场。我们将铁棒均匀分割成11段,每段1m长,假设截面积为1㎡。首先写出一维稳态常物...

1310
来自专栏数据和云

Thinking in SQL系列之:数据挖掘K均值聚类算法与城市分级

引言:SQL做为一种编程语言,能够满足各类数据处理的需要,关键就在于算法与思维方式。以SQL会友,希望结交更多的数据库、数据分析领域的朋友。 作者简介:牛超 ...

4197
来自专栏数据结构与算法

网络最大流算法—Dinic算法及优化

前置知识 网络最大流入门 前言 Dinic在信息学奥赛中是一种最常用的求网络最大流的算法。 它凭借着思路直观,代码难度小,性能优越等优势,深受广大oier青睐 ...

6847
来自专栏C/C++基础

网易游戏技术岗在线编程题(一)

小易经常沉迷于网络游戏.有一次,他在玩一个打怪升级的游戏,他的角色的初始能力值为 a.在接下来的一段时间内,他将会依次遇见n个怪物,每个怪物的防御力为b1,b2...

841
来自专栏互联网大杂烩

机器学习面试

线性回归的因变量是连续变量,自变量可以是连续变量,也可以是分类变量。如果只有一个自变量,且只有两类,那这个回归就等同于t检验。如果只有一个自变量,且有三类或更多...

1104
来自专栏封碎

一些重要的算法 博客分类: 算法 算法网络应用网页游戏领域模型游戏

      下面是一些比较重要的算法,原文 罗列了32个,但我觉得有很多是数论里的或是比较生僻的,和计算机的不相干,所以没有选取。下面的这些,有 的我们经常在用...

1101
来自专栏开心的学习之路

用责任链模式实现图像处理方法的选择(python)

结合我们822实验室开源的图像处理平台(http://822lab.top)介绍用责任链模式实现图像处理方法的选择(python),供后续学弟学妹参考,整个平台...

1514
来自专栏数据结构与算法

Noip 2016 Day1 题解

老师让我们刷历年真题, 然后漫不经心的说了一句:“你们就先做做noip2016 day1 吧” 。。。。。。 我还能说什么,,,,,老师你这是明摆着伤害我们啊2...

55712
来自专栏Petrichor的专栏

深度学习: 局部响应归一化 (Local Response Normalization,LRN)

局部响应归一化(Local Response Normalization,LRN):

9054

扫码关注云+社区

领取腾讯云代金券