技术头条 - 一个快速在微博传播文章的方式     搜索本站
您现在的位置首页 --> 算法 --> 关于短域名的那点事。。

关于短域名的那点事。。

浏览:1682次  出处信息
前段时间对短域名做了点小研究,其实大体上无非是用更大的进制来对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" ,,$base
);
        }
        
$t = ($num == 0) ? floor(log10($num) / log10($base
));
        for (
$t$t >= 0$t
--) {
            
$a floor($num pow$base$t 
));
            
$out $out substr($index$a1
);
            
$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
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
© 2009 - 2024 by blogread.cn 微博:@IT技术博客大学习

京ICP备15002552号-1