Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >科普:身份证号为什么不会重复?

科普:身份证号为什么不会重复?

作者头像
石燕平
发布于 2019-10-14 09:01:09
发布于 2019-10-14 09:01:09
1.7K05
代码可运行
举报
文章被收录于专栏:小石不识月_Leo小石不识月_Leo
运行总次数:5
代码可运行

中国目前已经超过十三亿人,一个巨大的数字,在如此庞大的人群下,政府是如何有序管理的呢?众所周知,每个人都有一个唯一标识的身份证号,你是否想过会不会有一个人和你有相同的身份证号呢?思考一下是如何做到不重复的呢?

身份证号里的小知识

先来看看身份证号内包含了哪些元素。

1.按地域划分。每个人出生都有一个出生地,某个省市,某个区县,总会有一个地点,一块空间,具体到身份证号里,前几位所代表的正是每个人所在的空间。2.按时间划分。每个人都有生日,生日代表着什么?如何把时间看做一条长河,那么你的生日就是上岸的那一刻岸的位置,可能这个位置这一刻有很多人上岸,但对于你个人只有一个位置,毋庸置疑。在身份证号里中间几位年月日就是这个时间点的体现。3.有序数字。就如你去吃饭等座,你会先领取一个号,从1到100,依次有序的加一,你所领取的这个号,在你吃饭之前肯定是唯一的,身份证号后几位即可与此类比。

我曾经思考过如果中国要出现一个和我有一样的身份证号到底有多大的可能,算了一下后几乎是不可能的。因为每个人的身份证号前几位因为自己的地域不同而各不相同,中间几位生日不同也不相同,那如果要两个人身份证号要相同需要具备什么样的条件呢?

身份证号码的规则

在身份证号中,在前六位中第一到第二位确定省级市,第三至第四确定地级市,第五至第六确定县级市。

对于中间八位的规则:用户的出生年月日,如你是1994年1月22日出生的,中间八位为19940122。

第十五至十六位为0-9之间的顺序码,00-99之间的数字。

第十七位代表性别,奇数为男,偶数为女。

第十八位为0-10(10用罗马数字X代替)的校验码,而且这里的校验码并非随机产生,而是由前十七位来决定的,他的计算公式如下:

身份证号里校验码的意义

校验码的存在就是检查当前身份证号是否正确,下面是一个检查身份证号的正确性的函数,有兴趣的试试自己的身份证号。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 左移 a << b  将 a 的二进制形式向左移 b (< 32) 比特位,右边用0填充。
function checkId(id) {
  if (typeof id === 'number') return '请输入字符串类型的身份证号';
  if(id.length !== 18) return '请输入正确的身份证号';
  let sum = 0;
  for(let i=0; i<17; i++) {
    sum += ((1 << (17 - i)) % 11) * id[i];
  }
  const n = (12 - (sum % 11)) % 11;
  return n === Number(id[17]) || id[17] === 'X';
}

算算身份证号重复的概率

如果要两个人身份证号相同,首先要保证两个人在同一个地区保证身份证号前六位相同,接下来需要有相同的生日,保证中间八位相同 ,还剩下最后四位,而最后一位校验码的出现是取决于前17位的,所以只有第十五到十七位三个数字是可变化的,那能承载多少人呢?

第十五位和十六位为随机数,均可出现10中可能,第十七位由于性别奇偶之分,只有5中可能,所以可得出下面的算式。

男性:10 * 10 * 5 = 550 女性:10 * 10 * 5 = 550

我是男性,从上面可以看出来,如果在我所出生的区(身份证前六位精确到区县)并且在我出生的那一天有501个男孩出生,如果保证身份证位数恒定18位不增加且只允许数字情况下,肯定有两个人要撞身份证号,所以与我撞身份证号的可能性即为五百分之一。

现实数据统计

我查了一些资料,中国2018年全年出生人口1523万人,2017年出生人口约为1723万,2016年约为1786万,这里就当做每年出生人口为1700万,中国一共有超过2800多个县区,那我们来算一算大概一个区县每天平均有多少人出生呢?

17000000/365/2800 = 16.63

平均每天每个区县有17个新生儿,有一些人口密集的地方超平均数10倍或者20倍,也可看出来也离500个差距甚远,所以可得出结论基本没有可能两个人身份证号会相同,如果人口真到非常庞大的时候 ,身份证号也会相应增加位数或者引入英文字母来规避号码相同的问题。

中心化机构

这里从上面身份证号关于重复的计算可以看出,先有了户籍管理部门来制定好一些规则,然后地方的实施者(派出所)再按照规则去生成每个人的身份证号,在这里抛出了最关键的一个点,中心化的户籍部门。

在计算机世界里,我们都知道每个能访问到的服务器都有一个唯一标识IP地址,你能通过IP地址准确找到你的服务器,是怎么实现的呢?其实与身份证号生成流程是一致的,都是要有一个中心化的机构去做分发地址这件事,这个计算机世界里这个中心化机构就是因特网信息中心。

为什么真有人身份证号相同?

其实生活中确实存在着身份证号相同的问题,在互联网还不是非常普及的时候,各地的派出所没有联网条件,也没办法查该身份证号是否存在,都是靠人来记录的,所以会导致极少一部分人员出现身份证号重复的问题。

这也说明中心机构的可靠性是保证身份证号唯一性的重要原因。

思考

最后思考一下,如果没有中心化机构了,我们又该怎么做类似身份证号的唯一标识呢?请看下一篇,无中心化机构,计算机世界的唯一标识是如何生成之UUID?

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-08-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小石不识月 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
身份证号码的那些事
身份证对我们来说可谓是息息相关的。身份证就是身份的证明,不论是出行坐船、坐火车、坐飞机,还是出门办事情都离不开这个“宝贝”。
老肥码码码
2020/01/17
7490
身份证号码的那些事
身份证号校验规则
中国居民身份证号码编码规则 第一、二位表示省(自治区、直辖市、特别行政区)。 第三、四位表示市(地级市、自治州、盟及国家直辖市所属市辖区和县的汇总码)。其中,01-20,51-70表示省直辖市;21-50表示地区(自治州、盟)。 第五、六位表示县(市辖区、县级市、旗)。01-18表示市辖区或地区(自治州、盟)辖县级市;21-80表示县(旗);81-99表示省直辖县级市。 第七、十四位表示出生年月日(单数字月日左侧用0补齐)。其中年份用四位数字表示,年、月、日之间不用分隔符。例如:1981年05月11日就用19810511表示。 第十五、十七位表示顺序码。对同地区、同年、月、日出生的人员编定的顺序号。其中第十七位奇数分给男性,偶数分给女性。 第十八位表示校验码。作为尾号的校验码,是由号码编制单位按统一的公式计算出来的,校验码如果出现数字10,就用X来代替,详情参考下方计算方法。
超级小可爱
2023/02/20
2.6K0
一文带你看透身份证归属地
身份证是中华人民共和国居民身份证的简称,是一种由中国政府颁发的用于证明个人身份的法定证件。它是中国公民在社会经济生活中的重要身份识别工具之一,也是公安机关、银行、交通运输等行业和部门所认可的有效证件。
不是海碗
2023/03/15
2K0
一文带你看透身份证归属地
PHP根据身份证号码验证、获取星座、生肖和性别函数
居民身份证,是用于证明持有人身份的一种法定证件,多由各国或地区政府发行予公民。并作为每个人重要的身份证明文件。首先介绍一下身份证含义 新的 18 位身份证号码各位的含义: 1-2 位省、自治区、直辖市代码; 3-4 位地级市、盟、自治州代码; 5-6 位县、县级市、区代码; 7-14 位出生年月日,比如 19670401 代表 1967 年 4 月 1 日; 15-17 位为顺序号,其中 17 位男为单数,女为双数; 18 位为校验码,0-9 和 X,由公式随机产生。 举例: 130503
沈唁
2018/05/24
2.6K0
Python计算身份证第18位(校验码)来判断身份证是否输入正确
例如:某女性的身份证号码是220202202002020022。我们要看看这个身份证是不是合法的身份证。 首先我们得出前17位的乘积和是98,然后用98除以11得出其余数是10。最后通过对应规则就可以知道余数10对应的数字是2。所以,可以判定这是一个合格的身份证号码。
zeruns
2020/03/23
5K0
涨姿势:用Python完成15位18位身份证的互转
最近工作中刚好要清洗一批客户数据,涉及到身份证号码15位和18位的转换,特意研究了下,在这里分享下。
Python攻城狮
2019/11/07
2.8K0
涨姿势:用Python完成15位18位身份证的互转
校验身份证号码
之前在做项目的时候遇到了需要校验身份证号码,最初始的想法就是校验一下是否数字还有就是校验长度,后来想到有的身份证号的最末尾数字是X,于是又加入了一层判断末尾数为X的判断。
OECOM
2020/07/02
2.7K0
使用FME验证身份证号码
公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位地址码,八位出生日期码,三位顺序码和一位校验码。
数据处理与分析
2021/05/13
2.2K0
使用FME验证身份证号码
如何通过MD5反查身份证号
身份号码是特征组合码,由前十七位数字本体码和最后一位数字校验码组成。排列顺序从左至右依次为六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。
goodspeed
2020/12/22
2K0
如何通过MD5反查身份证号
【Go】根据身份证(或生日)计算年龄
我们计算用户的年龄,当然只能根据用户的出生年月日信息来计算。这里我们定义:用户出生满1年后,年龄算1岁,不满1年算0岁,以此类推,大于1年不到2年算1岁。
后端码匠
2023/11/12
5430
身份证号码验证算法
做项目的时候需要对拿到的数据进行“清洗”,比如剔除一些不可能存在的身份证号码。查阅了网上的身份证号码验证算法,自己也总结一下。 (一)18身份证号码的结构 公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。 排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位校验码。  1、地址码  表示编码对象常住户口所在县(市、旗、区)的行政区域划分代码,按GB/T2260的规定执行。 2、出生日期码  表示编码对象出生的年、月、日,按GB/T74
似水的流年
2018/01/18
2.5K0
身份证校验(c++实现)
我国国标〖GB 11643-1999〗中规定:公民身份号码是18位特征组合码,由十七位数字本体码和一位数字校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。其校验码(最后一位)计算方法和步骤为:
用户2038589
2018/09/06
1.8K0
56行Python代码实现身份证字典生成器
最近过生日,女朋友送了几本Python黑客编程的书(没错,小黑阔也是可以有女朋友的)。哈哈,皮一下就是很开心。
用户1631416
2018/12/13
10.2K0
Oracle 关于身份证校验规则详细说明(附有代码复制可执行)
省份(2位)市(2位)区[县](2位)年(2位)月(2位)日(2位)+3位序列号 [奇数给男性/偶数给女性]
星哥玩云
2022/08/16
2.1K0
二代身份证号码验证器[超简单]
第十八位的数字是根据ISO 7064:1983.MOD 11-2校验码算法计算出来的
全栈程序员站长
2022/09/14
1.4K0
VBA从身份证号获取信息
接着上一次的例子,表格汇总完成后,你又得到了一个任务,需要对表格的数据进行处理,需要增加出生日期、性别。
xyj
2020/07/28
1.7K0
VBA从身份证号获取信息
正则表达式 - 18位身份证号
        18位身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位校验码。其含义如下:
用户1148526
2023/04/28
1.4K0
C#验证二代身份证号码
身份证号码的验证及15位升18位算法 18位身份证标准在国家质量技术监督局于1999年7月1日实施的GB11643-1999《公民身份号码》中做了明确的规定。 GB11643-1999《公民身份号码》为GB11643-1989《社会保障号码》的修订版,其中指出将原标准名称”社会保障号码”更名为”公民身份号码”,另外GB11643-1999《公民身份号码》从实施之日起代替GB11643-1989。GB11643-1999《公民身份号码》主要内容如下: 一、范围 该标准规定了公民身份号码的编码对象、号码的结构和表现形式,使每个编码对象获得一个唯一的、不变的法定号码。 二、编码对象 公民身份号码的编码对象是具有中华人民共和国国籍的公民。 三、号码的结构和表示形式 1、号码的结构 公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。 2、地址码 表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按GB/T2260的规定执行。 3、出生日期码 表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日代码之间不用分隔符。 4、顺序码 表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。 5、校验码 (1)十七位数字本体码加权求和公式 S = Sum(Ai * Wi),先对前17位数字的权求和 Ai:表示第i位置上的身份证号码数字值 Wi:表示第i位置上的加权因子 Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
全栈程序员站长
2022/09/14
3600
浅谈正则表达式验证身份证号码(C# winform)
目前我国公民身份证号码由18位数字组成:前6位为地址码,第7至14位为出生日期码,第15至17位为顺序码,第18位为校验码。检验码分别是“0、1、2、……10”共11个数字,当检验码为“10”时,为了保证公民身份证号码18位,所以用“X”表示。虽然校验码为“X”不能更换,但若需全用数字表示,只需将18位公民身份号码转换成15位居民身份证号码,去掉第7至8位和最后1位3个数码。
全栈程序员站长
2021/08/12
1.6K0
java随机生成姓名、邮箱、ip、MAC地址、手机号、经纬度以及身份证号等工具类
臣妾做不到啊。这也太难了吧。怎么办。。突然辞职在脑子里打转。看了看钱包,呵呵一笑。我能做出来。。
猿码优创
2019/07/27
7.8K2
相关推荐
身份证号码的那些事
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验