专栏首页算法与数据之美身份证号码的那些事

身份证号码的那些事

点击上方“算法与数据之美”,选择“置顶公众号”

更多精彩等你来!

身份证对我们来说可谓是息息相关的。身份证就是身份的证明,不论是出行坐船、坐火车、坐飞机,还是出门办事情都离不开这个“宝贝”。

我们都知道身份证是由18位数字(或者最后一位是X)构成的,那么具体这些数字每一位是如何设置的呢?

身份证号码组成

下面这个表给出了各位数字的由来。首先是前六位,这六位是地址码,就是户口所在地的对应编号,如下图 110105 就是北京朝阳区的编号;中间的八位是出生日期码,对应年月日。

1

1

0

1

0

5

地址码

Y

Y

Y

Y

M

M

D

D

出生日期码

接着第十五和十六位是顺序码,具体指同一地址码所标识的区域范围内,对同年同月同日出生的(也就是前十四位完全相同)人员编订的顺序号;倒数第二位则是性别码,若男性则为奇数,女性则为偶数;而最后一位则是校验码,根据一种校验规则得到的数字,如果按照校验规则得到数字为十,则用 X 来代替。

8

8

8

X

顺序及性别码

校验码

校验规则

校验码(身份证最后一位)是根据前面十七位数字码,按照ISO7064:1983.MOD11-2 校验码计算出来的检验码。具体的计算方法如下:

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。(即余数0对应1,余数1对应0,余数2对应X...)

根据校验规则,我们可以通过 Python 来实现一个简单的身份证校验的功能。

def id2code(s):
    coe = {0: 7, 1: 9, 2: 10, 3: 5, 4: 8, 5: 4, 6: 2, 7: 1, 8: 6, 9: 3, 10: 7, 11: 9, 12: 10, 13: 5, 14: 8, 15: 4, 16: 2}
    sum_num = 0
    l = []
    for i in s[:17]:
        l.append(int(i))
    for i in range(17):
        sum_num = sum_num + coe[i] * l[i]
    return sum_num % 11

构造一个 coe 系数字典,计算得到余数,再按照映射关系得到第十八位。最后与输入的身份证号的最后一位比对,即可做出一个简单的判断。

安全问题

根据这些知识我们会发现,想要得到一个人的身份证号码相当容易,尤其是和你有些接触的人。他们知道你的户口所在地,知道你的生日,这些在你的社交网络中甚至是公开的信息

这样他们就掌握了你的身份证的前十四位准确信息。根据你的性别还能确定第十七位的奇偶性,而由于第十八位只是一个校验位,因此仅仅需要猜测2.5位的信息。一共也就10*10*5=500种可能,这点计算对计算机来说简直小菜一碟,暴力枚举就可以破解。而身份证号码的暴露,可能也会带来诸多风险,对个人带来不好的影响。

本文分享自微信公众号 - 算法与数据之美(algo_and_data),作者:斐波那契小李

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-09-28

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Nice,我用AI给表情包分门别类!

    之前有写过爬取大量表情包以供广大网友斗图使用,有部分网友反映这样的表情包太乱太杂,量确实是足够的,但没有分门别类,熊猫头、杰尼龟、脆皮鹦鹉等等热门表情包都是一锅...

    老肥码码码
  • 学计算机的男生发这个给我看是什么意思?

    今天知乎热榜上出现了一个非常有意思的话题,某个女生收到了男生的一个用Python程序打印出来的爱心,问是何意思。

    老肥码码码
  • 如何加速一个简单的for循环?

    那么加速的其中一个关键就是减少循环次数,因为每次循环结束之后本质上都是一个分支指令的判断,判断这次循环是否结束。如果是则跳出循环,进行下一个代码块的执行,否则继...

    老肥码码码
  • 用call和ret实现子程序

    ret和call是另外两种转移指令,它们与jmp的主要区别是,它们还包含入栈和出栈的操作。具体的原理如下: ret操作相当于:pop ip(直接将栈顶元素赋...

    Masimaro
  • Auto-Encoding Variational Bayes 两个ppt下载

    用户1908973
  • MYSQL 查询优化之路-之DISTINCT全表扫描

    背景:今天对一个20w的表做关联查询,创建各种索引,没有提高执行的效率,使用EXPLAIN检查,总是提示“Using temporary”全表扫描,这不是我想的...

    用户5640963
  • Hbase表两种数据备份方法-导入和导出示例[未测试]

    场合:由于线上和测试环境是分离的,无法在测试环境访问线上库,所以需要将线上的hbase表导出一部分到测试环境中的hbase表,这就是本文的由来。

    双面人
  • python pyqt5常用固定大小主窗体

    from PyQt5 import QtCore, QtGui, QtWidgets import sys from PyQt5.QtWidgets imp...

    用户5760343
  • 给Emlog评论区添加楼层及子楼层

    杨逸轩
  • 2. Linux-3.14.12内存管理笔记【系统启动阶段的memblock算法(2)】

    memory:表示可用可分配的内存; 结束完memblock算法初始化前的准备工作,回到memblock算法初始化及其算法实现上面。memblock是一个很简...

    233333

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动