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,這樣不就不會重復了嗎。。 - -