微博短连接解析ShortUrl【PHP代码实现】

      1、背景简介 html

      短网址应用已经在各大微博上开始流行了起来。例如QQ微博的url.cn,新浪的sinaurl.cn等。咱们在QQ微博上发布网址的时候,微博会自动判别网址,并将其转换,例如:http://url.cn/0nAcBW算法

       为何要这样作的,缘由我想有这样几点:
      一、微博限制字数为140字一条,那么若是咱们须要发一些链接上去,可是这个链接很是的长,以致于将近要占用咱们内容的一半篇幅,这确定是不能被容许的,因此短网址应运而生了。
      二、短网址能够在咱们项目里能够很好的对开放级URL进行管理。有一部分网址能够会涵盖色情,暴力,广告等信息,这样咱们能够经过用户的举报,彻底管理这个链接将不出如今咱们的应用中,应为一样的URL经过加密算法以后,获得的地址是同样的。
      三、咱们能够对一系列的网址进行流量,点击等统计,挖掘出大多数用户的关注点,这样有利于咱们对项目的后续工做更好的做出决策。 数据库

      2、如何实现 加密

      下面先来看看短网址映射算法的理论(网上找到的资料)
      1)将长网址md5生成32位签名串,分为4段, 每段8个字节;
      2)对这四段循环处理, 取8个字节, 将他当作16进制串与0x3fffffff(30位1)与操做, 即超过30位的忽略处理;
      3)这30位分红6段, 每5位的数字做为字母表的索引取得特定字符, 依次进行得到6位字符串;
      4)总的md5串能够得到4个6位串; 取里面的任意一个就可做为这个长url的短url地址;
      下面是PHP代码:
      function shorturl($input) {       
            $base32 = array ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h','i', 'j', 'k', 'l', 'm', 'n', 'o', 'p','q', 'r', 's', 't', 'u', 'v', 'w', 'x','y', 'z', '0', '1', '2', '3', '4', '5'); 
url

            $hex = md5('prefix'.$input.'surfix');      
            $hexLen = strlen($hex);        
            $subHexLen = $hexLen / 8;       
            $output = array();         
            for ($i = 0; $i < $subHexLen; $i++) {                
                  $subHex = substr ($hex, $i * 8, 8);                
                  $int = 0x3FFFFFFF & (1 * ('0x'.$subHex));               
                  $out = '';                
                  for ($j = 0; $j < 6; $j++) {                       
                        $val = 0x0000001F & $int;                        
                        $out .= $base32[$val];                        
                        $int = $int >> 5;                
                  }               
                  $output = $out;       
            }       
            return $output;
      }
spa

      3、输出结果
      执行下面代码的结果以下,会产生4 组6 位字符串,任意一组均可以做为当前字符串的短连接地址。
      print_r (shorturl(‘http://www.i5good.com/shorturl.html’));
      结果:
      nibgx3 htm

      4、跳转原理
      当咱们生成短连接以后,只须要在表中(数据库或者NoSql )存储原始连接与短连接的映射关系便可。当咱们访问短连接时,只须要从映射关系中找到原始连接,便可跳转到原始连接。 索引

相关文章
相关标签/搜索