【转】关于短域名的那点事。。

转载自:http://blogread.cn/it/article/4371?f=wb

前段时间对短域名做了点小研究,其实大体上无非是用更大的进制来对10进制数值进行缩短,并存入一个kvdb中,到时候直接提取即可。

这里我使用的是Tokyo Tyrant,不了解这个玩意儿的,可以自行google,你可以把它当成memcached来使用就行了。

以下是我的代码。注意,这里我没有考虑Tokyo Tyrant宕机的问题,各位可以自行研究怎么来做。

<?php 
/** 
 * 短域名生成&解析类 
 * @author 废墟 <r.anerg@gmail.com> 
 * @version 1.0 2011-5-12 
 */ 
class Sort_URL { 

    private $mem; 
    private $base_url = 'http://anerg.com/'; 

    public function  __construct() { 
        $mem_conf    = array( 
                array( 
                        'host'    => '192.168.10.90', 
                        'port'    => '11116' 
                ), 
                array( 
                        'host'    => '192.168.10.90', 
                        'port'    => '11117' 
                ), 
        ); 
        $this->mem    = new Memcache(); 
        foreach ($mem_conf as $v) { 
            $this->mem->addServer($v['host'], $v['port']); 
        } 
    } 

    public function encode($url) { 
        $url    = trim($url); 
        if(!preg_match("#^[http://|https://|ftp://]#iS", $url)) { 
            return false; 
        } 
        $md5    = md5($url); 
        $aid    = $this->mem->get($md5); 
        if(!$aid) { 
            if(($aid = $this->mem->increment('auto_increment_id')) === false) { 
                $this->mem->set('auto_increment_id', 10000); 
                $aid = $this->mem->increment('auto_increment_id'); 
            } 
            $this->mem->set($md5, $aid); 
            $key    = $this->dec2any($aid); 
            $this->mem->set($key, $url); 
        } else { 
            $key    = $this->dec2any($aid); 
        } 

        return $this->base_url.$key; 
    } 

    public function decode($url) { 
        $key    = str_replace($this->base_url, '', trim($url)); 
        return $this->mem->get($key); 
    } 

    private function dec2any($num, $base=62, $index=false) { 
        $out = ''; 
        if (! $base ) { 
            $base = strlen($index); 
        } else if (! $index ) { 
            $index = substr("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" ,0 ,$base);
        } 
        $t = ($num == 0) ? 0 : floor(log10($num) / log10($base)); 
        for ($t; $t >= 0; $t--) { 
            $a = floor($num / pow( $base, $t )); 
            $out = $out . substr($index, $a, 1); 
            $num = $num - ($a * pow( $base, $t )); 
        } 
        return $out; 
    } 
} 

$app = new Sort_URL(); 
$url = array( 
    'http://www.iciba.com', 
    'http://www.hp009.com', 
    'http://edu.hp009.com', 
    'http://doc.hp009.com', 
    'http://news.edu.hp009.com/2011/0512/1532639.shtml' 
); 
foreach ($url as $v) { 
    $sort    = $app->encode($v); 
    echo "sort link: ".$sort."\n"; 
    $original    = $app->decode($sort); 
    echo "original: ".$original."\n"; 
} 
?>

上面的代码将输出

sort link: http://anerg.com/2Bj
original: http://www.iciba.com
sort link: http://anerg.com/2Bk
original: http://www.hp009.com
sort link: http://anerg.com/2Bl
original: http://edu.hp009.com
sort link: http://anerg.com/2Bm
original: http://doc.hp009.com
sort link: http://anerg.com/2Bo
original: http://news.edu.hp009.com/2011/0512/1532639.shtml

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值