短鏈結演算法收集與分析

2022-02-12 18:53:49 字數 1965 閱讀 3793

yun.io        

如何實現呢,大概有三個步驟:

1、定義乙個url對映演算法,可以將長的url對映成短字串;

2、使用乙個儲存(資料庫?nosql?)來儲存完成的對映;

3、實現自己的url對映演算法;

一般來說,第三步是我們比較頭疼的,如何將乙個長的url字串,對映成乙個較短的字串呢。我總結了三種辦法:

普通實現

我想以前大家學習過十進位制和二進位制的互相轉換,或者十進位制和十六進製制的互相轉換,那麼為了更短,我們可以使用62進製,對於乙個數字id進行轉碼,轉換成乙個短字串。

這種做法的缺點是沒有辦法保證所有鏈結都是固定的位數的長度,而且在高併發的情況下,如何保證能夠快速分發是個問題。

具體實現方法:

/**

* 利用62進製對數字id進行短鏈結編碼,缺點不能保證每個短鏈結是固定長度

*

* @author  wanshiqiang

* @param integer $integer

* @param string $base

*/

private function getshortenedurlfromid ($integer, $base = allowed_chars)

return $base[$integer] . $out;

}  

/**

* 對62進製編碼的短鏈結進行解碼

*

* @author  wangshiqiang

* @param string $string

* @param string $base

*/

private function getidfromshortenedurl ($string, $base = allowed_chars)

return $out;

}

文藝實現

演算法描述:使用6個字元來表示短鏈結,我們使用ascii字元中的'a'-'z','0'-'5',共計32個字元做為集合。每個字元有32種狀態,六個字元就可以表示32^6(1073741824),那麼如何得到這六個字元,描述如下:

對傳入的長url進行md5,得到乙個32位的字串,這個字串變化很多,是16的32次方,基本上可以保證唯一性。將這32位分成四份,每乙份8個字元,這時機率變成了16的8次方,是4294967296,這個數字碰撞的機率也比較小啦,關鍵是後面的一次處理。我們將這個8位的字元認為是16進製制整數,也就是1*('0x'.$val),然後取0-30位,每5個一組,算出他的整數值,然後對映到我們準備的32個字元中,最後就能夠得到乙個6位的短鏈結位址。

php實現如下:

function shorten( $long_url )

$output = $out;

}

return $output;

}

二逼實現

下面這個函式使用了純隨機的方式來生成乙個短鏈結,雖然我們可以通過查詢操作來確保不重複使用短鏈結,可是... 這樣真的靠譜嗎~~

function random($length, $pool = '')

srand ((double)microtime()*1000000);

for($i = 0; $i < $length; $i++)

return $random;

}

technorati 標籤: 短鏈結,short url,對映,雜湊

短鏈結原理分析

常見的短鏈結壓縮演算法有兩種,第一種是對 url 進行hash運算,在得到的hash值上做進一步運算,得到乙個較短的hash值。第二種是通過資料庫自增id或分布式key value系統模擬發號器進行發號壓縮url。兩種方式各有優劣,hash運算簡單易實現,但是有一定的衝突率。隨著 url 壓縮數量的...

短鏈結生成演算法

public static string shorturl string url 對傳入 進行 md5 加密 string smd5encryptresult md5util.md5 url string hex smd5encryptresult string resurl new string ...

HTTP的長連線與短鏈結

長連線和短連線的概念 短連線 在http 1.0 中預設的是短連線,短連線就是雙方有資料互動時,就建立乙個連線,資料傳送完畢後就斷開此連線,即每次只完成一項任務的傳送 長連線 從http 1.1 起使用的就是長連線,長連線是指在乙個連線上可以傳送多個資料報,在連線保持期間,如果沒有資料報傳送,雙方需...