今天回家后几乎一直在弄这个问题,原因是走了弯路,短URL是由a-zA-Z0-9这个62个字符中的其中任意6个组合而成,组合后的总数总共有
500多亿个,之前一直想用十六进制位运算,累加进位,但是始终不成功,后来在网上看了下,说是把原URL进行MD5后再进行位运算,得到4种组合随意取
一种,但是结果也会出现重复的情况,尽管概率很小,所以这种方法也被pass掉,最后琢磨了大半晚上,终于做出一种绝不会出现重复结果的算法。
首先肯定的说,这62个字符随意取其中6个组合,组合数量高达500多亿,如果把数字和字符组合做一个映射关系,那不就只能得到唯一的字符串了吗,
比如第62个组合就是aaaaa9,第63个组合就是aaaaba,再利用洗牌算法,把原字符串打乱后保存,那么对应位置的组合字符串就会是无序的组合。
简单举个例子
提供的字符只有a,b,c,d 进行洗牌打乱后为 b,a,d,c 取其中任意3个字符为一个字符串组合,其组合数量是64个
那么我进行URL转换的时候首先把原URL插入到数据库,再根据数据库插入返回的新ID,找出对应的字符串,例如返回ID为1,那么对应上面的字符串组合就是
bbb
同理 ID为2时,字符串组合为
bba
依次类推
3——bbd
4——bbc
5——bab
6——baa
7——bad
8——bac
……
直至到达64种组合后才会出现重复的可能,所以如果用上面的62个字符,任意取6个字符组合成字符串的话,你的数据存量达到500多亿后才会出现重复的可能。
form:http://www.uchome8.com/209
上面是别人的想法,很不错的想法,保存下,但是如果需要设置个性的短网址又要怎么实现呢 考虑中。
如果设置非个性的短域名的长度为6,要求个性的短域名长度不能为6,可为其它任何数,个性短域名和非个性的域名保存在不同的表,貌似问题就解决了。再考虑考虑。
个性短域名主要为了方便大家记住一些不容易记住的连接,比如一般人都记不住微软的网址(我是到现在都没记住),采用个性域名保存该网址后,设置个性为xx。cn/weiruan ,以后访问不是就很方便了。不知道有没有人会这么用。也许只是我个人的一点想法。