php短連結、短網址、短url的實現代碼

來源:互聯網
上載者:User
  1. /**
  2. * 短串連產生演算法
  3. * site: bbs.it-home.org
  4. */
  5. class Short_Url {
  6. #字元表
  7. public static $charset = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
  8. public static function short($url) {
  9. $key = "alexis";
  10. $urlhash = md5($key . $url);
  11. $len = strlen($urlhash);
  12. #將加密後的串分成4段,每段4位元組,對每段進行計算,一共可以產生四組短串連
  13. for ($i = 0; $i < 4; $i++) {
  14. $urlhash_piece = substr($urlhash, $i * $len / 4, $len / 4);
  15. #將分段的位與0x3fffffff做位與,0x3fffffff表示位元的30個1,即30位以後的加密串都歸零
  16. $hex = hexdec($urlhash_piece) & 0x3fffffff; #此處需要用到hexdec()將16進位字串轉為10進位數值型,否則運算會不正常
  17. $short_url = "http://t.cn/";
  18. #產生6位短串連
  19. for ($j = 0; $j < 6; $j++) {
  20. #將得到的值與0x0000003d,3d為61,即charset的座標最大值
  21. $short_url .= self::$charset[$hex & 0x0000003d];
  22. #迴圈完以後將hex右移5位
  23. $hex = $hex >> 5;
  24. }
  25. $short_url_list[] = $short_url;
  26. }
  27. return $short_url_list;
  28. }
  29. }
  30. $url = "http://www.bbs.it-home.org/jb//";
  31. $short = Short_Url::short($url);
  32. print_r($short);
  33. ?>
複製代碼

輸出結果: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即可。

代碼:

  1. Class TinyURL {
  2. static private $key = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; //可以多位 保證每位的字元在URL裡面正常顯示即可
  3. private function __construct() {}
  4. private function __clone(){}
  5. static public function encode($value) {
  6. $base = strlen( self::$key );
  7. $arr = array();
  8. while( $value != 0 ) {
  9. $arr[] = $value % $base;
  10. $value = floor( $value / $base );
  11. }
  12. $result = "";
  13. while( isset($arr[0]) ) $result .= substr(self::$key, array_pop($arr), 1 );
  14. return $result;
  15. }
  16. static public function decode($value) {
  17. $base = strlen( self::$key );
  18. $num = 0;
  19. $key = array_flip( str_split(self::$key) );
  20. $arr = str_split($value);
  21. for($len = count($arr) - 1, $i = 0; $i <= $len; $i++) {
  22. $num += pow($base, $i) * $key[$arr[$len-$i]];
  23. }
  24. return $num;
  25. }
  26. }
複製代碼

調用樣本:

  1. $t = 100;
  2. $time_start = microtime(true);
  3. while($t--){
  4. var_dump( TinyURL::encode(1000000) );
  5. var_dump( TinyURL::decode("4C92") );
  6. }
  7. $time_end = microtime(true);
  8. printf("[記憶體使用量: %.2fMB]\r\n", memory_get_usage() /1024 /1024 );
  9. printf("[記憶體最高使用: %.2fMB]\r\n", memory_get_peak_usage() /1024 /1024) ;
  10. printf("[執行時間: %.2f毫秒]\r\n", ($time_end - $time_start) * 1000 );
複製代碼

以上代碼適用於:自增ID的傳統關係型資料庫。需要執行二次SQL,第一次擷取自增ID,第二次根據ID產生短連結。[或者3次,額外一次用於判斷是否存在此短連結。]

此外,還有一種是根據URL進行Hash運算的演算法,這種演算法的優點: 1,無需id,用Key/Value這樣的格式即可滿足儲存。 2,SQL插入只需一條語句。 3,產生的資料具有離散性,無法觀察產生規律。

缺點: 1,所以的Hash演算法都存在衝突的可能,一旦衝突原始的就會被覆蓋。[當然你可以增加額外的邏輯去判斷。] 2,資料規模不好控制,你不知道什麼時候才能開始使用新的Hash資料位元,但隨著資料量的增加,衝突的機率會越來越高。 此種的代碼適用於NoSQL等非關係型資料庫,尋找快更新快。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.