小程序
传感搜
传感圈

身份证最后一位是X的人,受了多少苦?

2022-10-06
关注

本文来自微信公众号:果壳 (ID:Guokr42),作者:欧剃,题图来自:视觉中国


“为啥我的身份证号码最后有个叉?我看大家的都是数字啊。是不是因为我特别厉害?X战警!”


家里的“神兽”忽然指着户口簿上自己身份证号的X,发出了一连串的疑问。看着孩子这么开心,我真不忍心告诉他这个X会带来多少小麻烦。


社交网站上,“X之人”诉说着X之痛丨微博


到网上随便搜一搜,就能发现有很多“X之人”对默认密码的抱怨。对于身份证尾号是数字的大部分朋友来说,“后六位”作为各种账号、证件的初始密码是一件习以为常的事。但对于身份证尾号是X的“天选之子”就没那么简单了。


不仅不同系统要求X的大小写不一样,有的甚至把“X之人”的初始密码设置成去除X后再向前顺推一位……这谁能一次性输入正确啊!


“X之人”:要不然你们这些系统“打一架”吧,谁赢了用谁的规则


既然这么麻烦,为啥身份证号码非得弄个字母X。这些人又是怎么被选中成为“X之人”?


掐指一算,你是X


末尾X的诞生,其实全靠前17位数的“支持”。


现在通行的身份证是第二代居民身份证,其中的18位身份证号码,也成了每个人都刻在脑子里的数字。身份证号末尾的X代表的也是数字,表示数字“10”。


第二代居民身份证的正面是国徽、证件名称、签发机关和证件有效期,背面是照片和登载的个人身份信息,其中最后一行公民身份号码,就是平时俗称的“身份证号码”。丨居民身份证式样,公安部行业标准《居民身份证总体技术要求》GA/T 448-2021


公民身份号码共有18位数字:


6位地址码,按照《中华人民共和国行政区划代码》(GB/T 2260)确定的,户口所在地县一级行政区划代码。由于行政区划代码在历史上经过多次修订,所以就算是同一个地区出生的人,前六位也不一定相同。


8位出生日期码,四位数年份+2位数月份+2位数日期。


3位顺序码,男性为奇数,女性为偶数。


最后再加一位校验码。


公民身份号码结构丨国家标准《公民身份号码》GB11643—1999


身份证号码充满了“随机性”——我们没法计划自己何时出生、出生在何地。不过最后的这位校验码,却成了“不确定中的确定”。只要前17位都定下来了,最后这一位数字也就确定了。它是通过一套算法,将前17位数字代入运算得出来的数字。


这样费劲算数的目的,是为了以后检查错误更方便。身份证号码在输入的时候可能出现各种错误,除了漏字、多字这种位数显而易见的错误外,输错数字都不容易被发现。校验码则可以“反推”出身份证号码是否录入正确,甚至可以识别出相邻两位填反、错位等错误。


当然,校验码只是为防止随机发生的错误,它不能检查出有意的伪造错误,也不能用来自动更正发现的错误。


现有的身份证输入系统大多会自动计算你填的号码对不对


咋还算出了数字10?


结尾出现X,都得“怪”这套校验算法。这套算法采用的方法是取模11,得出的计算结果范围是0到10。但身份证只有18位,结尾变成10就多了一位。这才把10的“重任”交给X来表示。


温馨提示:如果你晕公式,可以跳过这段……


身份证最后一位的算法采用的是 ISO 7064 《数据处理——校验符系统》中给出的 MOD 11-2 校验码系统。这里的MOD 11-2表示模数是11,基数是2。也就是校验公式(见下)中,需要将总数除以11(模数)并取余数,而每个位置上的加权因子是通过以2(基数)为底的几何级数算出来的。


公民身份号码校验公式丨国家标准《公民身份号码》GB11643—1999


身份号码中的校验码位于最右边,所以它位置序号i=1,对应的加权因子W1也等于1。按照公式,我们需要将身份证号码中其他各个位置上的数字都乘以对应的因子,把它们加起来得到总数,再将总数除以11并取余数。如果这个余数加上校验码(乘1还是本身)以后,除以11的余数是1,那就说明这个号码能够满足公式的校验。


为了方便计算,国家标准中直接给出了校验码a1和余数的换算关系对应表:


来源:国家标准《公民身份号码》GB11643—1999


举个例子:


校验码计算范例丨国家标准《公民身份号码》GB11643—1999


因为模数是11,所以最后的结果有0~10共10种可能性,为了保证校验码只占1个字符位置,当算出来的 a1 等于10时,在身份证上用罗马数字符X表示。


(耶,X终于出现了!)


简单点说,X的出现是因为模数取了11。设计校验算法,是希望让算法尽可能覆盖到常见的身份证号码录入错误。对于取模11的情况而言,ISO 7064 标准的附录A给出了该算法的有效性:能识别到所有的单替换、单换位和位移错误,对双替换错误的识别率也有90%。


不要X行不行?


相对而言,取模10虽然能避免X的出现,但它对相邻两位互换错误的识别率较低,也导致当存在2位或更多错误时,无法保证90%的识别率。


另外一种避免X出现的思路是,不使用会产生校验字符值为10的号码串。但因为身份证号码的前14位基本是固定生成的,除去校验码,只有最后三位数顺序码能调整。这样一来,同一地区同一天内可容纳的号码数量就少了许多。


挪威的身份证号码共11位数字,前六位是以DDMMYY(日-月-年)顺序排列的出生日期,接下来是3位随机码和2位校验码。第一位校验码负责校验1~9位数字,第二位校验码负责校验1~10位数字。他们要算两遍,而且权重还不一样。


挪威的校验码算法也是模11,为了避免出现X,他们弃用了所有会产生校验字符值为10的号码串。这导致他们损失了约17%的可用容量。


冰岛的身份证号码跟挪威有点像,校验码算法也是模11。为了避免出现X,他们也弃用了所有会产生校验字符值为10的号码串。只有2位随机码,导致冰岛每天大约只能同时出生80个人……考虑到冰岛的总人口仅约37万,按2020年1.5%的人口增长率来算,80个也还算充裕。


无处不在的校验码


除了身份证,有很多需要用到一串数字来表示的代号里都有校验码。


有些校验码不止会出现X。比如我国现行的法人和其他组织统一社会信用代码由18位阿拉伯数字或大写英文字母(不使用I、O、Z、S、V)组成。其中第17位是第9~16位的校验码(模11)。第18位是对前17位进行校验的校验码,虽然也使用 ISO 7064 的校验码系统,但为了兼容可能存在的英文字母,所以选取了MOD 31-3的算法系统。算出来的校验值可能的取值范围是从0~30,用A~Y的大写英文字母(不含I、O、Z、S、V)代表10~30之间的数字。


我们生活中常用的二维码其实也有校验功能。QR码的生成程序在将信息写入二维图案的时候,会使用名为BCH编码的纠错码生成算法,将冗余信息写入图案中。通过专门的解码算法,程序不但能校验出数据有没有错误,还能知道错误在哪,以便程序自动校正、恢复数据。容错等级最高的QR码支持在多达30%数据无法读取的情况下还能正确还原完整信息。


QR码的编码结构丨Wiki Commons


在生活中,有很多数字和字母都在暗暗校验着某些标签正确与否。虽然有时候“X之人”会遇到些小麻烦,但校验码还是帮人们避免了不少难以察觉的错误。


对于不同的系统而言,设计代码时使用了不用的数据类型,导致有的可以读取X,有的却不能。从而出现了各不相同的规则来限制最后一位的输入。


总之,希望各个系统能早日统一最后一位的输入规则吧,“X之人”真的累了。(狗头)


参考文献

[1] GA/T 448-2021 居民身份证总体技术要求. https://hbba.sacinfo.org.cn/attachment/onlineRead/a90a5a366e77dd80a07c5ef29df56bcc8fe1d92996727162f185eeff93ceaea7 

[2] GB 11643-1999 公民身份号码. https://openstd.samr.gov.cn/bzgk/gb/newGbInfo?hcno=080D6FBF2BB468F9007657F26D60013E

[3] 姚先锋. 如何用Excel读取二代身份证的相关信息[C]//.2013年度江苏省测绘学会年会论文集.,2013:123-124.


本文来自微信公众号:果壳 (ID:Guokr42),作者:欧剃

您觉得本篇内容如何
评分

评论

您需要登录才可以回复|注册

提交评论

提取码
复制提取码
点击跳转至百度网盘