猿问

关于短网址算法的问题

在网上看到如下的短网址算法
  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转换不行么?
慕勒3428872
浏览 311回答 2
2回答

FFIVE

首先短网址生成是由于在微博等短文本应用中,长的地址占用空间太大,所以需要短网址服务商将长网址和短网址进行映射,楼主说的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个中的一个
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答