在一位工作多年的大神的指导下,采用了这种方法。将id转化为固定长度的32进制字符串,并加上自己的算法。为什么这里采用32进制,而不是其他进制呢?32进制可以包含足够多的英文字符,生成的加密串看起来会更规范,另一方面,排除一些不容易识别的英文字符(这里排除ILOU),因此采用了32进制,而并没有采用36进制。
加密过程,方法idToString(),因考虑到刚开始id比较小的时候,转为32进制会出现比较多的0,看起来很不规范,因此设定一个初始值INIT_NUM,这个可以自定义。根据传过来的id,加上初始值后得到一个长度为10位的数值,将这个数值间隔位拆开分为长度为4位的$num1和长度为6位的$num2,两个数值分别转换为32进制,$num1转化后得到长度为3的字符串,不足的用U补足,$num2得到长度为4的字符串,不足的用L来补足。
解密则是逆操作,反向操作即可。
测试:生成
$obj = new convert(32);$res1 = $obj->idToString(12);结果:
85U43DM解密:
$obj = new convert(32);$res1 = $obj->stringToId('85U43DM');结果:
12总结
当然,即使最后的这个方法中也存在有不足的地方,比如在对加密数值拆分为2个num值的时候,用的方法就很不灵活,一旦修改解密的地方也要跟着变动。这里只是分享一个思路,欢迎大家批评指正。