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