PHP 短連接生成


 1 <?php 
 2     #短連接生成算法
 3     
 4     class Short_Url {
 5         #字符表
 6         public static $charset = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
 7 
 8         public static function short($url) {
 9             $key = "alexis";
10             $urlhash = md5($key . $url);
11             $len = strlen($urlhash);
12 
13             #將加密后的串分成4段,每段4字節,對每段進行計算,一共可以生成四組短連接
14             for ($i = 0; $i < 4; $i++) {
15                 $urlhash_piece = substr($urlhash, $i * $len / 4, $len / 4);
16                 #將分段的位與0x3fffffff做位與,0x3fffffff表示二進制數的30個1,即30位以后的加密串都歸零
17                 $hex = hexdec($urlhash_piece) & 0x3fffffff; #此處需要用到hexdec()將16進制字符串轉為10進制數值型,否則運算會不正常
18 
19                 $short_url = "http://t.cn/";
20                 #生成6位短連接
21                 for ($j = 0; $j < 6; $j++) {
22                     #將得到的值與0x0000003d,3d為61,即charset的坐標最大值
23                     $short_url .= self::$charset[$hex & 0x0000003d];
24                     #循環完以后將hex右移5位
25                     $hex = $hex >> 5;
26                 }
27 
28                 $short_url_list[] = $short_url;
29             }
30 
31             return $short_url_list;
32         }
33     }
34 
35     $url = "http://www.cnblogs.com/zemliu/";
36     $short = Short_Url::short($url);
37     print_r($short);
38 ?>

Array ( [0] => http://t.cn/KyfLyH [1] => http://t.cn/bPafHS [2] => http://t.cn/H880aD [3] => http://t.cn/TmvDK0 )

生成的短url存到服務器里,做一個映射,short_url => original_url,輸入短url的時候按照映射轉回長url,然后訪問原始url即可

 

PS:另外有一種想法,就是把url按照順序存貯,第一條為aaaaaa,第二條為aaaaab..以此類推,不需要hash,這樣不就不會重復了嗎。。 - -


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM