身份证号码的改进方案脑洞

(关于身份证号码的一些思考和脑洞)

身份证号里,X出现概率 9%,以至于很大比例的普通人不知道身份证末尾存在X的情况。

一部分人看到末尾X的身份证号误以为不对,当然这不足以造成多大问题。

更大的影响是计算机程序方面,当时应该没有计算机软件方面的专业人士充分参与讨论。

夹杂1个字母X的缺点至少有:

  • 人们听说读写身份证号码时, 夹杂1个字母,没有纯数字方便,部分受教育水平较低的人士不认识字母。
  • 人们在电脑或手机上输入身份证号码时,遇到X要切换输入法,不如纯数字方便。
  • 在电脑或手机的各种填表程序中,一些不够专业和细心的设计和测试人员,没有考虑到这个特殊情况,于是有的程序无法填写字母,有的要求大写X,有的要求小写X,造成程序BUG或用户困扰。
  • 编写校验身份证号的程序代码时,不能完全用数字计算逻辑,要把X转换为10再进行计算和比较。
    可见,虽说大毛病没有,但是用户体验不够好。

那有没有好一些的方案呢?

答案是肯定的。以下是我的一些脑洞。

首先想到的是, 直接舍弃X的号码, 取下一个纯数字号码就行了. 但是事情没这么简单, 当初15位升18位的时候, 为了保持一致性, 是在年份加上2位, 如80变成1980, 末尾加上校验位. 后面的校验位不是能够随便换的, 是根据前面的号码计算而来的, 而前面的号码不变, 后面这个就不能想换就换.

作为马后炮的想法, 当初也可以不保证15位身份证的后3位顺序号保留不变, 这样就可以通过修改顺序号来跳过含X的18位号码了.

但现在已经广泛使用了, 就不好改变了.

所以, 以下仅从纯理论层面探讨.

假设新方案要求:

1.不降低校验作用
2.纯数字的编码方案
3.尽量少改动, 仍然保持18位
4.尽量使计算机系统不会造成混淆
5.尽量使人眼能够区分新旧号码
6.新旧号码不存在交集, 二者可以互相一对一转换

核心就是校验码由1位变2位, 如果仍然保持总共18位, 那就必须其它位置减少1位, 只能从6位的地区位或8位的日期位来抠1位了, 不能从3位的顺序码去抠不然不够用。

方案(1): 地区6位, 改为电话区号4位.

现在地区位有6位, 太浪费了, 不妨用4位电话区号为素材做身份证开头, 由于区号是0开头, 电脑上容易造成头部0丢失, 所以可把前面的0换为非0数字, 3位区号就直接前面加上非0数字即可.

如上海电话区号021, 转成对应 9021. 杭州0571, 转成对应 9571.

6位一下子减少为4位, 除了拿1个给校验位, 还多出1位, 可以保留为0或添给顺序码使用.

但是我不确定是否有电话区号刚好和现在的地区前4位重合的, 如果存在重合, 需要避开, 从而避免号码冲突.

方案(2): 年月日8位, 改为7位

要么改年份4位为3位, 要么改月日为3位.

-1) 有人提出年份只保留3位, 直接舍弃年份首位. 我认为不可取.

会造成200年后新号码与现在的旧号码重复.

举例: 2199年1月2日的就编为1990102, 而会与1990年10月20日~29日的号码可能重复.

且不说以后人类可能活到200多岁, 就算不考虑人类寿命超期, 比如银行系统, 也不能200年就把储户账号删了吧, 遗产继承人说不定啥时候出来呢, 号码重复肯定会造成麻烦.

所以可以排除舍弃年份首位的方案.

-2) 改日期为3位.

一年365-366天, 3位数是够表达的. 但直接用001-366表达日期就不太方便人脑计算月日, 但可以采用一种我称之为"MDD"的日期编码方案, 虽然不如现在直观, 但换算也很简单, 只需要加减运算.

"MDD"的日期编码方案:

-2.1) 1~8月的日期: M="月+1", DD=日日。
举例: 201表示1月1日, 320表示2月20日。

-2.2) 9~12月的日期: M=月-7, DD=日+40。
举例: 9月1日表示为"241", 10月8日表示为"348", 12月31日表示为"571"。

M避开0和1的使用, 是为了避免MDD与现有身份证号的日期前3位出现交集, 用于区分新旧号码。

示例:

MDD示例含义计算
2011月1日月=M-1=2-1=1
8317月31日月=M-1=8-1=7
34510月5日月=M+7=10, 日=DD-40=5
57112月31日月=M+7=12, 日=DD-40=31

2位数校验码的计算方法

采用 ISO 7064 Mod 97-10 校验码规范, 校验码范围为 00~96。
用前16位数字计算得到2位数字校验码, 计算方法跟现在身份证号码的算法基本一致, 只是用于乘除的数值不同了。
乘数依次为 38, 62, 45, 53, 15, 50, 5, 49, 34, 81, 76, 27, 90, 9, 30, 3. 除数为97.

总结

上述2个方案缺点:

方案(1)改变了地区编码, 可能导致现有户籍管理的软件系统必须修改升级. 其它根据前6位判断地区的软件系统, 都需要修改。

方案(2)改变了日期编码, 同样会导致旧有软件系统需要修改升级。

上述方案优点:

  • 纯数字18位, 避免字母X导致的问题。
  • 与现有规则的身份证号码不存在交集, 可以一眼区分新旧, 可以互相转换。
  • 可用号码数量没有减少。
  • 校验力度更强, 算法符合 ISO 7064 Mod 97-10 校验码规范. (现有身份证号校验码算法为 ISO 7064 MOD 11-2)。

后话

当一个方案广泛使用到每个角落之后, 要想改变, 代价太大了, 就像美国还在广泛使用蹩脚的英制单位一样, 虽然缺点多, 但是改变太难了.

像身份证编号规则, 这种重大决定, 如果当初考虑更充分一点, 可能现在要少很多麻烦.

评论 (0)

    (无须注册)