短网址算法

短网址算法
1)将长网址md5生成32位签名串,分为4段, 每段8个字节;
2)对这四段循环处理, 取8个字节, 将他看成16进制串与0x3fffffff(30位1)与操作, 即超过30位的忽略处理;
3)这30位分成6段, 每5位的数字作为字母表的索引取得特定字符, 依次进行获得6位字符串;
4)总的md5串可以获得4个6位串; 取里面的任意一个就可作为这个长url的短url地址


php代码实现如下:

<?php
class Short_Url 
{ 
    #字符表 
    public static $charset = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; 

    public static function short($url) 
    {
        $key = "alexis"; 
        $urlhash = md5($key . $url); 
        $len = strlen($urlhash); 
        #将加密后的串分成4段,每段4字节,对每段进行计算,一共可以生成四组短连接 
        for ($i = 0; $i < 4; $i++) 
        { 
            $urlhash_piece = substr($urlhash, $i * $len / 4, $len / 4); 
            #将分段的位与0x3fffffff做位与,0x3fffffff表示二进制数的30个1,即30位以前的加密串都归零 
            $hex = hexdec($urlhash_piece) & 0x3fffffff; #此处需要用到hexdec()将16进制字符串转为10进制数值型,否则运算会不正常 

            $short_url = "http://t.cn/"; 
            #生成6位短连接 
            for ($j = 0; $j < 6; $j++) 
            { 
                #将得到的值与0x0000003d,3d为61,即charset的坐标最大值 
                $short_url .= self::$charset[$hex & 0x0000003d]; 
                #循环完以后将hex右移5位 
                $hex = $hex >> 5; 
            }
            $short_url_list[] = $short_url; 
        } 

        return $short_url_list; 
    } 
} 
 
$url = "http://www.www.jbxue.com/jb/"; 
$short = Short_Url::short($url); 
P($short);
        
$short_url = 'http://t.cn/RAbB36H';
$headers = get_headers($short_url, TRUE);
echo $short_url.'=>'.$headers['Location'];

function P($var)
{
    echo '<pre>';
    print_r($var);
    echo '</pre>';    
}


你可能感兴趣的:(PHP,算法)