这是一张目前通行的第二代居民身份证,有国徽的这面是正面,有个人信息的是反面,底部这串 18 位的编码是身份证号。
(相关资料图)
从左到右前 6 位数是地址码,参考行政区划代码,依次代表省级、市级、县级所在地区。
不过,由于行政区划代码曾多次修订,哪怕来自同一个地方,身份证上这 6 位也可能不一样。
随后 8 位数字是出生日期码,接下来的 3 位是该日期出生婴儿的顺序码,在 000 到 999 之间,偶数被分配给女性,奇数被分配给男性。
那么,最后一位代表什么?为什么有人是数字,有人是 X 呢?
前 17 位数字说尽了身份证主人的出生地、年龄和性别,而最后的字母并不携带实质信息,它是额外添加的校验码。
当我们手动输入身份证号,除了多一位、少一位这种比较明显的失误,可能难以发现自己输错了。
而身份证最后一位的校验码可以快速检测出这些错误,系统往往会弹出提醒,让用户重新输入:
那么,校验码是怎么发现身份证格式错误的?
身份证最后一位校验码数值通过 MOD 运算得出,通过代入身份证前 17 位数字,计算出最后 1 位校验码,采用的算法是 MOD 11-2。
具体公式长这样:
这是一个求余公式,a¡ 和 W¡ 的乘积之和除以 11,余数是 1。
i 代表身份证号从右到左的位置序号,a¡ 对应第 i 位置上的身份证数字,它们都为 0 到 10 之间的整数。现在以这个身份证号为例,计算一下 a 的数值。
公式中的 W¡ 以 2 为基数,由另一个公式求余算出。根据公式,把所有 a¡ 和 W¡ 的数值相乘,再将乘积相加除以 11,已知余数为 1,由此可以计算出此处 a 的值是 10。
也就是说,这个身份证号最后 1 位应该是 10,但直接用数字 10 会让号码从 18 位变成 19 位,因此用罗马数字 X 来替代 10。
身份证号最后一位 1-X 校验码都由此公式算出,如果你的身份证号出现 X,说明根据前 17 位计算出的数值刚好为 10。
X 的存在解决了位数的问题,但有可能给身份证主人带来烦恼,比如一些网站将身份证号的后 6 位作为初始密码,却不支持输入字母。
既然 10 这么麻烦,为什么不干脆去掉它,把校验码的范围限定在 0 到 9 呢?这是因为 MOD 11 算法识别各类错误的概率都在 90% 以上,MOD 10 算法则无法保证如此高的识别率。
不止身份证号里有校验码,日常许多编码都会用到,但计算校验码的方法各异。比如,法人和其他组织统一社会信用代码用的是 MOD 31-3 算法,需要除以 31 取余数,得到的校验码在 0 到 30 之间,大于等于 10 的数字用英文字母代替。
商品条码的校验码算法则不涉及余数,通过加减计算得出。
我们每天都要用到的二维码(QR Code),则用到了更为复杂的里德 - 所罗门编码,通过它生成的码,已经超越了普通校验码 " 发现错误 " 的层次,上升到能 " 纠正错误 " 的 level。
纠错级别最高的一款,就算码上高达 30% 的信息无法识别,依然可以还原出完整信息。
身份证号末尾的数字和 X 是与主人没有关系的信息,但作为校验码中的一员,它仅有的一个字节隐藏着一连串的计算,在你输错时弹窗提醒,悄悄地刷一把公式的 " 存在感 "。
你认识身份证号自带 X 的人吗?欢迎在评论区和我们交流。
头条 22-11-06
头条 22-11-06
头条 22-11-06
头条 22-11-06
头条 22-11-06
头条 22-11-06
头条 22-11-06
头条 22-11-06
头条 22-11-06
头条 22-11-06
头条 22-11-06
头条 22-11-06
头条 22-11-06
头条 22-11-06
头条 22-11-06
头条 22-11-06
头条 22-11-05
头条 22-11-05
头条 22-11-05
头条 22-11-05
头条 22-11-05
头条 22-11-05
头条 22-11-05
头条 22-11-05
头条 22-11-05
头条 22-11-05
头条 22-11-05
头条 22-11-05
头条 22-11-05
头条 22-11-05
头条 22-11-05
头条 22-11-05
头条 22-11-05
头条 22-11-05
头条 22-11-05
头条 22-11-05
头条 22-11-05
头条 22-11-04
头条 22-11-04
头条 22-11-04
头条 22-11-04
头条 22-11-04
头条 22-11-04
头条 22-11-04
头条 22-11-04
头条 22-11-04
头条 22-11-04
头条 22-11-04
头条 22-11-04
头条 22-11-04
头条 22-11-04
头条 22-11-04
头条 22-11-04
头条 22-11-04