前段时间在做短链平台项目时,对短链码的生成进行了研究,我将思维活动和方案探讨过程进行了记录,文章没什么干货,都是思维过程。
短链码生成方式,应具备以下几个特点:生成性能强劲、碰撞概率低(避免重复|恶意猜测)、业务规则安全,针对以上特点寻找可靠的生成方式。
方案1:
例如自增ID的方式,即利用插入数据库,利用数据库自增id,把自增id转成62进制作为短链码。
缺点:自增方式短链码的长度不固定,随着 id 变大,短链码长度也增长;
方案2:
可延续方案1的观点,将自增ID可以指定从某个长度(如10000000000)开始增长,到百亿、千亿数量,然后转62进制存储展示。
缺点:自增ID方式短链码是有序的递增,存在【业务数据安全】问题,可以根据短链码转为10进制便可知道其全库数据量;
方案3:
采用MD5内容压缩,即长链接做md5加密,加密串查询是否已经生成过短链接,如果已经存在,则拼接时间戳再MD5加密,插入数据库,如果不存在则把长链接、长链接加密串插入数据库,取MD5后 最后1 个 8 位字符串作为短链码(取8位是为减小访问时的字符串长度)。
缺点:采用MD5可能存在重复的可能,取最后8位是有损压缩算法,数据量超大情况碰撞概念越大
方案4:
使用MurMurHash,其本质也是将一个元素映射成另一个元素,但他是一种非加密的Hash,性能比MD5强,MurmurHash的 32 bit 能表示的最大值近 43 亿的10进制,将其转换为62进制只有6位数,完全满足短链码的要求了
为什么要用62进制转换,不是64进制?62进制转换是因为62进制转换后只含数字+小写+大写字母,而64进制转换会含有/、+这样的符号(不符合正常URL的字符),10进制转62进制可以缩短字符,如果我们要6位字符的话,已经有560亿个组合了