短網址服務做得最好的應該就是:bit.ly(包括支持數據統計等) 了。
短網址服務說白了就是URL映射,將較長的URL映射成短字符串。短址本質上是實現了一個映射函數 f(x)-> y 。對於每一個 y, 能夠找到唯一的一個 x 使得 f(x) = y。即不能產生一短URL地址對應多個長URL。可能的數據庫存儲格式爲:
-
ID,int, 自動增長;
-
LURL,varchar, // 長URL;
-
SURL, varchar, // 短URL。
現在我們考慮通過如何長URL得到唯一的短URL。
方案一:數據庫自增長ID轉換進制
使用自增長ID首先是不會產生重複,但是由於自增長ID由於是10進制,就會使URl變得很長,可以採用進制壓縮的方式將URL變短。爲了更好的提升URL的可讀性,需要在製作URL的時候考慮到:
-
考慮到大小寫的字母讀音相同,所以暫定都使用大寫字母。這樣便於口頭傳播。
-
考慮到發音相近,可以將字母中的L,R,I,M,N,G,J都去除。(或者再加上B,P)
-
考慮到字形相同,可以將0和O都去除。便於識別。
於是可用字符爲26+10-7-2=2。然後需要確定最小需要的位數:
-
27^3=19683
-
27^4=531441
-
27^5=14348907
-
27^6=387420489
從上面的數據可以看到,使用了六位就可足以對我們的URL進行加密。相關的算法:略
方案二:URL hash計算
對URL進行處理的時候很容易想到MD5,MD5長度固定、衝突概率小等特性都是優勢,但是由於MD5長度爲32個字符,所以用來做短網址可能不太合適,那麼能不能以MD5爲基礎,將其字符進行縮短呢。以下爲這個方案的具體實現:
-
將長網址用md5算法生成32位簽名串,分爲4段,,每段8個字符;
-
對這4段循環處理,取每段的8個字符, 將他看成16進制字符串與0x3fffffff(30位1)的位與操作,超過30位的忽略處理;
-
將每段得到的這30位又分成6段,每5位的數字作爲字母表的索引取得特定字符,依次進行獲得6位字符串;
-
這樣一個md5字符串可以獲得4個6位串,取裏面的任意一個就可作爲這個長url的短url地址。
算法內容:略
由於上述算法對Md5進行了處理和截取,所以算法的重複的機率大約是n/(32^6) 也就是n/1,073,741,824(n是數據庫中記錄的條數),所以不建議使用。