址缩短服务是越来越流行, 特别是在Twitter的推动下,网址缩短服务被更多人了解,并使用。
有名气的如:TinyURL(Twitter最先使用的), Bit.Ly(Twitter现在使用的),Is.Gd 等等,网上现在搜索一下一大把。
都知道怎么用,可它是如何工作的呢?
说起来也很简单,就是一个数据库,然后一一对应存储缩短字符和原URL。
当你要缩短一个网址时,先会去数据库看该网址有没有被存储过,如果存储过,直接返回你已经缩短的字符,比如我们常见的就4~6位;
如果没有存储,那就通过一些算法,来生成缩短字符,并和原URL一起存到数据库。
这中间会有重复的问题,那就得看算法实现了
原理很简单,就是把你的网址放到他的数据库,然后与一个自动生成的短字符关联起来 那么下次你点击的时候就可以直接输入这个短地址,
然后他的网站把你的浏览器重定向到你原来输入的网址
在2010年12月,新浪向蔡文胜以超过500万元(估计价)的价格买下t.cn域名之后,
在国内掀起一股“T”域名关注热潮,在新浪微博拿下t.cn域名之后,域名跳转新浪微博官网,
期间,关于t.cn的具体用途诸多猜测,最后于2011年3月正式启用作为短址服务推出,t.cn域名用途确定,
价值全面发挥中,“T”域名在国内同样吃香。google拿下g.cn,不同域名下短网址的算法是不一样的
算法原理
算法一
1)将长网址md5生成32位签名串,分为4段, 每段8个字节;
2)对这四段循环处理, 取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个组合就是aaaaa9,第63个组合就是aaaaba,再利用洗牌算法,把原字符串打乱后保存,那么对应位置的组合字符串就会是无序的组合。
把长网址存入数据库,取返回的id,找出对应的字符串,例如返回ID为1,那么对应上面的字符串组合就是bbb,同理 ID为2时,字符串组合为bba,依次类推,直至到达64种组合后才会出现重复的可能,所以如果用上面的62个字符,任意取6个字符组合成字符串的话,你的数据存量达到500多亿后才会出现重复的可能。
具体参看这里彻底完善新浪微博接口和超短URL算法,算法四可以算作是此算法的一种实现,此算法一般不会重复,但是如果是统计的话,就有很大问题,特别是对域名相关的统计,就抓瞎了.
长网址转为短网址 http://www.gl.cx/
方法一:
function base62($x)
{
    $show = '';
    while($x > 0) {
        $s = $x % 62;
        if ($s > 35) {
            $s = chr($s+61);          
        } elseif ($s > 9 && $s <=35) {
            $s = chr($s + 55);
       }
        $show .= $s;
        $x = floor($x/62);
    }
    return $show;  
}
function urlShort($url)
{
    $url = crc32($url);
    $result = sprintf("%u", $url);
    return base62($result);
}
echo urlShort(" http://www.baidu.com");
 
方法二:产生唯一的
$res = shorturl('http://www.baidu.com');
var_dump($res);
function shorturl($url) { 
   $base_key = '';  
    $base_str = 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",  
    "6","7","8","9","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" );         
    $hex    = md5($base_key.$url);
      $hexLen = strlen($hex);  
      $subHexLen = $hexLen / 8;  
      $output = array();         
      for ($i = 0; $i < $subHexLen; $i++) {  
        $k =  $i + 1;   
          $subHex = substr ($hex, $i * 8, 8*$k);  
        $int = 0x3FFFFFFF & (1 * ('0x'.$subHex));  
  var_dump($int);
        $out = '';             
       for ($j = 0; $j < 6; $j++) {  
         $val = 0x0000003D & $int; 
          $out .= $base_str[$val];  
          $int = $int >> 5; 
        }    
        $output[] = $out;  
  }    
 return $output;  
}