关于短网址算法的问题
在网上看到如下的短网址算法
1)将长网址md5生成32位签名串,分为4段, 每段8个字节;
2)对这四段循环处理, 取8个字节, 将他看成16进制串与0x3fffffff(30位1)与操作, 即超过30位的忽略处理;
3)这30位分成6段, 每5位的数字作为字母表的索引取得特定字符, 依次进行获得6位字符串;
4)总的md5串可以获得4个6位串; 取里面的任意一个就可作为这个长url的短url地址;
实现的版本也很多 ,但是我不明白为什么要这样实现,为什么要超过30位要忽略,为啥要生成四个串?
如果生存四个串的话,直接把md5分成4段然后做base62转换不行么?
Answers
首先短网址生成是由于在微博等短文本应用中,长的地址占用空间太大,所以需要短网址服务商将长网址和短网址进行映射,楼主说的base62 就是转换为62进制的数字。62是[a-zA-Z0-9]的数量。
楼主说的位和字节感觉概念有混乱,我理解的是这样的
md5 -> 长度为32的16进制数,比如 a32f232a0ba32f232a0ba32f232a0b11, 然后把这个[1-8][9-16][17-24][25-32],分成了4段,每段有8位16进制的数,一个16进制相当于4位的二进制[1111] = 15 = F, 所以每段相当于32位的二进制,然后取了后30位,后30位平分为6段,每段长度为5bit,相当于有32个数,所以那个映射表估计是[a-z0-5],当然也可以平均分为5段,每段长度为6bit,这样就有64个,可以[a-zA-Z0-9] 再加两个其它字符(所以这时应该理解为啥要每段5bit了)。
之前不是分为了4段吗, 所以最后长度就是4了。
直接md5 分四段 在base62也可以啊, 就看你映射函数怎么写了,如何从 每段的 2^32个数 映射到 62个中的一个
网上的这些文章都是互相抄来抄去的,这篇文章我看了不下10次了,
这种方法甚至还不如crc32生成一个数字,然后通过62进制转换生成短字符串。
生成短路径一般有2种方法,
1.完全基于压缩算法实现,这样的好处是不用数据库,直接压缩解压即可,但是貌似不好实现。
2.基于数据库存储实现。
你列举的就是第二种,这种方法其实生成的字符串根本就无需这么麻烦的生成方式,我们只需要3个字段即可,
唯一ID,url,md5
我们只需要知道唯一ID就可以知道这个原地址是什么,我们插入的时候,先判断md5存在不,存在就直接返回唯一ID,不存在就插入,然后返回唯一ID。
唯一ID的生成,如果数据量不大,可以采用mysql的自增,但是一般这种情况下是不会采用mysql的,
所以可以采用时间戳(看情况是否按毫秒)+随机码。然后把这个数字转换成62进制即可,不足位的可以在前面补0.