《常见URL压缩算法总结》由会员分享,可在线阅读,更多相关《常见URL压缩算法总结(10页珍藏版)》请在金锄头文库上搜索。
1、常见常见 URLURL 压缩算法总结压缩算法总结看过新浪的短连接服务,发现后面主要有 6 个字符串组成,于是第一个想到的就是原来公司写的一个游戏激活码规则,也就是下面的算法 2,26 个大写字母 26 小写字母,10 个数字,随机生成 6 个然后插入数据库对应一个 id,短连接跳转的时候,根据字符串查询到对应 id,即可实现相应的跳转!不过 2 的 62次方,不知道有没有重复的,小概率可以,但是对应不是很大的网站应该足够了自从 twitter 推出短网址(shorturl),继之国内各大微博跟风,google 公开 goo.gl 使用 API,短网址之风愈演愈烈.不得不说这是一个新兴又一大热门
2、 web2.0 服务.现整理一下,包括完整短网址网站,短网址算法原理,算法举例,以及优劣比较,同时还介绍几个 phper 个人实现的.yourls,完整的 ShortUrl 网站.由国外著名 WordPress 插件大师级人物 Ozh Richard 和Lester Chan 一起写的.官方网站是 yourls.org.此为开源版本,可以从这里下载.最新版本 1.5,昨天试用了一下,默认第一个是 1,感觉不是很好,还是喜欢 twitter 风格的.turl,phper 的个人实现,可下载源码,点击此处算法原理算法一1)将长网址 md5 生成 32 位签名串,分为 4 段, 每段 8 个字节;2
3、)对这四段循环处理, 取 8 个字节, 将他看成 16 进制串与 0x3fffffff(30 位 1)与操作, 即超过30 位的忽略处理;3)这 30 位分成 6 段, 每 5 位的数字作为字母表的索引取得特定字符, 依次进行获得 6 位字符串;4)总的 md5 串可以获得 4 个 6 位串; 取里面的任意一个就可作为这个长 url 的短 url 地址;这种算法,虽然会生成 4 个,但是仍然存在重复几率,下面的算法一和三,就是这种的实现.算法二a-zA-Z0-9 这 64 位取 6 位组合,可产生 500 多亿个组合数量.把数字和字符组合做一定的映射,就可以产生唯一的字符串,如第 62 个组合
4、就是 aaaaa9,第 63 个组合就是 aaaaba,再利用洗牌算法,把原字符串打乱后保存,那么对应位置的组合字符串就会是无序的组合。把长网址存入数据库,取返回的 id,找出对应的字符串,例如返回 ID 为 1,那么对应上面的字符串组合就是 bbb,同理 ID 为 2 时,字符串组合为 bba,依次类推,直至到达 64 种组合后才会出现重复的可能,所以如果用上面的 62 个字符,任意取 6 个字符组合成字符串的话,你的数据存量达到 500 多亿后才会出现重复的可能。具体参看这里彻底完善新浪微博接口和超短 URL 算法,算法四可以算作是此算法的一种实现,此算法一般不会重复,但是如果是统计的话,
5、就有很大问题,特别是对域名相关的统计,就抓瞎了.短网址算法枚举一个来自 http:/ ,代码如下: 5; $output = $out; return $output; ? 另一个是纯随机数算法各大微博短网址(ShortUrl)的算法 ,第一种算法的 C#实现 5; /把字符串存入对应索引的输出数组 resUrli = outChars; return resUrl; ? 高进制数字转换,使用六十二进制将十进制数字变“短”。(作者自称很高效,但是来源页 打不开)例如数据库中第 56800235583 条信息,对应的短网址后缀可以是 ZZZZZZ 。下面是存储示例:短网址使用流程:提交网址存储后
6、获取其编号 如:123456用 dec2Any 将编号转换为 62 进制,并拼接网址 如:http:/go.to/w7e用户访问到 http:/go.to/w7e 时,提取短网址后缀 w7e用 any2Dec 将短网址后缀转换为 10 进制,得到链接编号 如:123456使用编号查询链接,并进行跳转/list下面是进制转换所需要的源码:$MAX_RADIX) $toRadix = 2; if ($toRadix = 10) return $dec; / -Long.MIN_VALUE 转换为 2 进制时长度为 65 $buf = array(); $charPos = 64; $isNegat
7、ive = $dec * fromBase 只能在 2 和 62 之间(包括 2 和 62) 。 * param number 输入数字 * param fromRadix 输入进制 * return 十进制数字 */ function any2Dec($number, $fromRadix) $num62 = 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ; $dec = 0; $digitValue = 0; $len = strlen($number) - 1; for ($t = 0; $t . PHP_EO
8、L; echo dec2Any(56800235583, 62), $sol; / ZZZZZZ echo any2Dec(ZZZZZZ, 62), $sol; / 56800235583 echo dec2Any(123456, 62), $sol; / w7e echo any2Dec(w7e, 62), $sol; / 123456 ? 另外,介绍一下 goo.gl 接口 api 的应用.据说此算法是各种短网址服务中 “.(这是)互联网上最稳定、最安全、最快速的短网址服务。“(google 声称)有人做了比较,证明确实如此。除了速度快,goo.gl 还提供详细的点击统计。比如,Yahoo
9、 首页的短网址是http:/goo.gl/QuXj,那么它的统计数据就在 http:/goo.gl/info/QuXj。加上后缀“.qr“,还能得到这个网址的二维条形码,Yahoo 的就是 http:/goo.gl/QuXj.qr。详细信息可从这查看:http:/ http:/ 弄的一个简单的 PHP调用 API 生成短网址方法,分享给大家。在使用前,请先到这里申请 API Key:http:/ POST 提交数据,所以使用了 curl,短网址的还原可以直接使用file_get_contents()函数。不过为了统一,也使用了 curl 来处理哈。$long_url, key = $apiKe
10、y); $jsonData = json_encode($postData); $curlObj = curl_init(); curl_setopt($curlObj, CURLOPT_URL, https:/ curl_setopt($curlObj, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curlObj, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($curlObj, CURLOPT_HEADER, 0); curl_setopt($curlObj, CURLOPT_HTTPHEADER, array(Con
11、tent-type:application/json); curl_setopt($curlObj, CURLOPT_POST, 1); curl_setopt($curlObj, CURLOPT_POSTFIELDS, $jsonData); $response = curl_exec($curlObj); curl_close($curlObj); $json = json_decode($response); return $json-id; /还原 function expandGoogleUrl($short_url) $curlObj = curl_init(); curl_set
12、opt($curlObj, CURLOPT_URL, https:/ curl_setopt($curlObj, CURLOPT_HEADER, 0); curl_setopt($curlObj, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curlObj, CURLOPT_SSL_VERIFYPEER, 0); $response = curl_exec($curlObj); curl_close($curlObj); $json = json_decode($response); return $json-longUrl; ? 在此处有个生成器,但是无代码奉献.点击此处