该方法使用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位,接下来我们详细解释,编码流程如下表:
号码位 | 对应原始字符 | 编码方式 | 编码结果 |
---|---|---|---|
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位身份证号码的编码
号码位 | 对应原始字符 | 编码方式 | 编码结果 |
---|---|---|---|
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