一种身份证号码的编码压缩方法

本文介绍了一种使用36个字符(0-9和大写A-Z)编码身份证号码的方法,旨在压缩18位和15位身份证号码至10个字符。通过两个36进制字符替代3个数字字符,18位号码编码为OOIIXR1EVQ,15位号码编码为OOII1EAR16。提供了PHP实现的编解码代码,并建议将出生年月日移到身份证号码末尾,以避免在Excel等软件中误转换导致的问题。
摘要由CSDN通过智能技术生成

该方法使用0-9和大写A-Z共36个字符(36进制)来编码身份证,虽然加上小写的a-z可以获得更大的编码压缩空间,但是在数据库等大部分应用工具中,区分大小写需要额外的设置,逻辑运算也需要特别留意,因此不考虑使用小写a-z。

  • 10进制与36进制字符对应关系如下:
  • 0=>'0'
  • 1=>'1'
  • 2=>'2'
  • 3=>'3'
  • 4=>'4'
  • 5=>'5'
  • 6=>'6'
  • 7=>'7'
  • 8=>'8'
  • 9=>'9'
  • 10=>'A'
  • 11=>'B'
  • 12=>'C'
  • 13=>'D'
  • 14=>'E'
  • 15=>'F'
  • 16=>'G'
  • 17=>'H'
  • 18=>'I'
  • 19=>'J'
  • 20=>'K'
  • 21=>'L'
  • 22=>'M'
  • 23=>'N'
  • 24=>'O'
  • 25=>'P'
  • 26=>'Q'
  • 27=>'R'
  • 28=>'S'
  • 29=>'T'
  • 30=>'U'
  • 31=>'V'
  • 32=>'W'
  • 33=>'X'
  • 34=>'Y'
  • 35=>'Z'

该方法将18位身份证号码和老的15位身份证号码同等压缩为10个字符。

虽然18位身份证号码的末位验证码是可以通过计算得出的,但是为了提高编解码效率,末位验证码仅当作普通字符来对待。

两个36进制字符可以最大表示36*36-1=1295,而1295>999,因此可以用两个36进制字符替代身份证号码中的3个数字字符。例如:36进制的4A=4*36+10=154(十进制)。可能细心的朋友会提问:如果是2替3,18位身份证号码只能被压缩到12位,怎么会是10位,接下来我们详细解释,编码流程如下表:

虚拟身份证号码88866620051027420X
号码位 对应原始字符 编码方式 编码结果
1,2,3 888 用两位36进制字符替换 OO
4,5,6 666 用两位36进制字符替换 II
7,8,11,12(出生年份前两位和月份) 2010 因为36进制恰好是12的3倍,因此可以0-B表示18**年1-12月,C-N表示19**年1-12月,O-Z表示20**年1-12月 X
13,14(出生日期) 27 用一位36进制字符替换 R
9,10,17(出生年份后两位和性别识别位) 050 用两位36进制字符替换(之所以跳过15和16位,将17位提前编码,目的是:只需要解码XR1E四个字符,就可以得到此人的出生时间和性别) 1E
18,15,16 X42 如果18位是X,就用10代替,X42变为1042,再将组合成的数字加100(加100的目的稍后解释),然后用两位36进制字符替换。18位前置是为了避免在X变为10的情况下组合成的数字大于1295,在此例中,如果不前置,组合成的数字就是4210,超过了两位36进制字符可以表示的范围。 VQ

至此,编码完毕,88866620051027420X编码为OOIIXR1EVQ

接下来说一下15位身份证号码的编码

虚拟身份证号码888666051027420
号码位 对应原始字符 编码方式 编码结果
1,2,3 888 用两位36进制字符替换 OO
4,5,6 666 用两位36进制字符替换 II
7,8,15(两位数的出生年份加末位) 050 用两位36进制字符替换(末位提前编码的目的和18位号码一样) 1E
9,10(出生月份) 10 用一位36进制字符替换 A
11,12(出生日期) 27 用一位36进制字符替换 R
13,14 42 用两位36进制字符替换(13,14位最大组合成99。刚才编码18位身份证号码的18,15,16时,需要加100的目的是为了让组合成的数字一定大于等于100。因为18位和15位的身份证号码编码后长度一样,如何区分,就要看最后两位解码为十进制以后的数字大小了,如果小于100,就说明这个编码对象是15位的旧号码,需要用旧号码的编码规则来逆向解码,否则就是18位规则) 16

至此,编码完毕,888666051027420编码为OOII1EAR16

下面贴出php实现18位身份证号码编解码的代码,该编解码过程不考虑身份证号码的正确性,因此,在编码之前需要先验证号码合规。

$format62=array(//此实例中只使用了前36个元素
0=>'0',
1=>'1',
2=>'2',
3=>'3',
4=>'4',
5=>'5',
6=>'6',
7=>'7',
8=>'8',
9=>'9',
10=>'A',
11=>'B',
12=>'C',
13=>'D',
14=>'E',
15=>'F',
16=>'G',
17=>'H',
18=>'I',
19=>'J',
20=>'K',
21=>'L',
22=>'M',
23=>'N',
24=>'O',
25=>'P',
26=>'Q',
27=>'R',
28=>'S',
29=>'T',
30=>'U',
31=>'V',
32=>'W',
33=>'X',
34=>'Y',
35=>'Z',
36=>'a',
37=>'b',
38=>'c',
39=>'d',
40
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ardentrain

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值