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

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

身份证号里的小知识

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

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

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

身份证号码的规则

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

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

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

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

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

身份证号里校验码的意义

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

// 左移 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?

原文发布于微信公众号 - 全栈者(fullStackEngineer)

原文发表时间:2019-08-14

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

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券