想了好久,不知道取什么标题,姑且暂时定这个标题吧。
在笔者的测试经历中,曾遇到过这样一个案例 身份证校验 输入 15 个 1 能校验通过。笔者曾经试图打算当 bug 反馈给研发,但凭借着职业敏感,决定尝试输入其他的测试条件 18 个 1 ,15 个 2 进行尝试, 结果在我的预料之中,这 2 次的输入测试是不合法的。那么问题来了,这 15 个 1 是否属于合法身份证? 带着这些疑问,笔者开始寻找真相。
首先在网上的一些身份证校验的网站上,大多数是认可 15 个 1 是合法的,少部分网站认为不合法,然而网上的一些技术党们争论不休。 回到这,我们不妨看一下身份证的验证规则 前 6 位 地区码 以此代表省 市 区 (县) 。中间 8(6) 位 是我们的出生年月日,剩下的是 3 位为顺序码 。其中 18 位身份证中的最后一位为校验码。倒数第二位为性别,这里对这个不在阐述。由于顺序码的产生是随机的,所以也不做讨论。
回到正题 15 位的身份证号(15 个 1)是否合法呢?接下来给大家看一张图:
看到这,可能很多朋友明白了,自己的身份证的最后一位是怎么来的了,不妨自己可以对照这张表,自己计算试试。 以本文的例子来说通过计算得到最后的和为 108 除以 11 得到的余数为 9.8 那么对应的数为 3 那么这个 15 位号码转换为 18 为既为: 11111119111111113 单从计算规则来看 ,那么这个在理论上是成立(合法)的, 我们现在把这个放到部分查询网站上去验证,得到的结果是通过的,但也有部分是不通过的,那么剩下的唯一可能性就是地区码的可能性了。 下一步笔者找了一些地区的地区码做进一步的验证。
北京 11、天津 12、河北 13、山西 14、内蒙古 15、辽宁 21、吉林 22、黑龙江 23、上海 31、江苏 32、浙江 33、安徽 34、福建 35、江西 36、山东 37、河南 41、湖北 42、湖南 43、广东 44、广西 45、海南 46、重庆 50、四川 51、贵州 52、云南 53、西藏 54、陕西 61、甘肃 62、青海 63、宁夏 64、新疆 65、台湾 (886) 71、香港 (852) 81、澳门 (853) 82。(这些只是省份代码)
下面我以北京以及湖南怀化的二个地区码为例由于受到地区码的影响故末尾的效验码随之做出改变:
110101 19111111 111X 、 431281 19111111 1112 在各大查询网站均查询通过。由于 6 个 1 的地区码并未在度娘中查到,因此如果严格按照身份验证的规则来说的话,本案例所说的 15 个 1 这条身份证号码是不存在的了。当然并不排除老的地区码的存在。
接下来我想讨论的是,需求是否一定要求严格的身份校验。 其次如果判断前面的地区码的话,如果有的县升级为市,部分区合并等等,可能会使用新的地区码,那么这个时候,是否在对程序进行判断,更改呢? 这样岂不是更麻烦? 其次这样带来的好处,以及做这个功能所带来的开发代码以及测试成本,整个之间的关系值得思考。