关于长链转短链的方案和思考
2019-12-09 本文已影响0人
小明同学_Random
背景
前些天,和同学交流,他说要做一个生成短链的系统,然后我们就针对这个进行了研究和讨论
讨论方案
- 我们首先讨论了下该系统的功能模块,既然是要把长链转成短链,必然需要一个生成短链的接口;既然生成了短链,那我们必然需要有短链转长链的功能。所有确定了系统提供的功能:
a. 由长链生成短链
b. 由短链还原长链 - 确定了功能,就开始设计方案,这里面就面临这两个问题,第一个问题,如何进行短链生成?第二个问题,如何还原出原有的长链?
a. 我们首先想到的是有没有一种算法可以实现长字符串转成短字符串,又可以把短字符串还原回去?简单思考了下这个其实不太现实,加密更多的是把字符串变的更长或者同长度的转换,这样才可以正常的解密回来。
b. 那我们需要一种算法把长字符串转成断字符串,然后落地下短链和长链的映射关系,这样也可以做到还原原有长链的功能,这也是我们最终确定的方案 - 确定了设计方案,我们如何设计长链变短链的算法?
a. 这里有一个问题,就是不同的链接不能变成相同的短链,也就是说我们需要针对短链进行去重。
b. 我们的短链要固定长度,也就是说无论多长的字符串,都要生成相同长度的字符串,首先想到的是随机数,只要长度足够,我们就可以随机出概率足够小的随机字符串来,再加上去重的方案,就可以保证唯一的短链生成。
c. 然后我们想到了hash,根据字符串的hash码再做映射出固定长度的字符串来,这样做相对随机数碰撞概率更小,重复生成的几率也就更少
d. 我们觉得这两种方案都是可行的,但是却总有些差强人意,有没有更好的方式去做?然后查询资料,发现了使用md5值的方案进行转换,具体如下:
0.确定短链为6位,每位由0-9a-zA-Z共62个字符组成,这样六位码可以组成580亿个组合。
1.首先通过原始链接进行MD5得到一个32位的0-9a-f的字符串。
2.把字符串按照1-6,6-11,11-16,16-21,21-26,26-31分成六份,每份六个字符
3.把每份的六位当成十六进制,计算得到一个long值,然后除以62得到余数,通过余数找到62个字符中的一个。
4.把六份字符串计算得到的字符组合后就是最终六位短码。
- 分析使用md5方式的好处与问题:
a. 固定长度的随机字符串生成
b. 碰撞几率更小
c. 这个没法解决重复的问题,还是有概率出现重复
思考
有没有其他一些方法?