短網址的原理和生成方法


 

URL短地址壓縮算法 微博短地址原理解析

分類: other   49人閱讀  評論(0)  收藏  舉報

短網址應用已經在全國各大微博上開始流行了起來。例如QQ微博的url.cn,新郎的sinaurl.cn等。

我們在QQ微博上發布網址的時候,微博會自動判別網址,並將其轉換,例如:http://url.cn/2hytQx

為什么要這樣做的,原因我想有這樣幾點:

  1. 微博限制字數為140字一條,那么如果我們需要發一些連接上去,但是這個連接非常的長,以至於將近要占用我們內容的一半篇幅,這肯定是不能被允許的,所以短網址應運而生了。
  2. 短網址可以在我們項目里可以很好的對開放級URL進行管理。有一部分網址可以會涵蓋色情,暴力,廣告等信息,這樣我們可以通過用戶的舉報,完全管理這個連接將不出現在我們的應用中,應為同樣的URL通過加密算法之后,得到的地址是一樣的。
  3. 我們可以對一系列的網址進行流量,點擊等統計,挖掘出大多數用戶的關注點,這樣有利於我們對項目的后續工作更好的作出決策。

其實以上三點純屬個人觀點,因為在我接下來的部分項目中會應用到,所以就了解了一下,下面先來看看短網址映射算法的理論(網上找到的資料):

  1. 將長網址md5生成32位簽名串,分為4段,每段8個字節;
  2. 對這四段循環處理,取8個字節,將他看成16進制串與0x3fffffff(30位1)與操作,即超過30位的忽略處理;
  3. 這30位分成6段,每5位的數字作為字母表的索引取得特定字符,依次進行獲得6位字符串;
  4. 總的md5串可以獲得4個6位串;取里面的任意一個就可作為這個長url的短url地址;

很簡單的理論,我們並不一定說得到的URL是唯一的,但是我們能夠取出4組URL,這樣幾乎不會出現太大的重復。

下面來看看程序部分:

[java]  view plain copy print ? 在CODE上查看代碼片 派生到我的代碼片
 
  1. public static string[] ShortUrl(string url)  
  2. {  
  3.     //可以自定義生成MD5加密字符傳前的混合KEY  
  4.     string key = "Leejor";  
  5.     //要使用生成URL的字符  
  6.     string[] chars = new string[]{  
  7.         "a","b","c","d","e","f","g","h",  
  8.         "i","j","k","l","m","n","o","p",  
  9.         "q","r","s","t","u","v","w","x",  
  10.         "y","z","0","1","2","3","4","5",  
  11.         "6","7","8","9","A","B","C","D",  
  12.         "E","F","G","H","I","J","K","L",  
  13.         "M","N","O","P","Q","R","S","T",  
  14.         "U","V","W","X","Y","Z"  
  15.     };  
  16.    
  17.     //對傳入網址進行MD5加密  
  18.     string hex = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(key + url, "md5");  
  19.   
  20.     string[] resUrl = new string[4];  
  21.   
  22.     for (int i = 0; i < 4; i++)  
  23.     {  
  24.         //把加密字符按照8位一組16進制與0x3FFFFFFF進行位與運算  
  25.         int hexint = 0x3FFFFFFF & Convert.ToInt32("0x" + hex.Substring(i * 88), 16);  
  26.         string outChars = string.Empty;  
  27.         for (int j = 0; j < 6; j++)  
  28.         {  
  29.             //把得到的值與0x0000003D進行位與運算,取得字符數組chars索引  
  30.             int index = 0x0000003D & hexint;  
  31.             //把取得的字符相加  
  32.             outChars += chars[index];  
  33.             //每次循環按位右移5位  
  34.             hexint = hexint >> 5;  
  35.         }  
  36.         //把字符串存入對應索引的輸出數組  
  37.         resUrl[i] = outChars;  
  38.     }  
  39.     return resUrl;  
  40. }  

現在可以直接使用該方法,可以等到下面四組值:

[html]  view plain copy print ? 在CODE上查看代碼片 派生到我的代碼片
 
  1. ShortUrl(http://www.me3.cn)[0];  //得到值fAVfui  
  2. ShortUrl(http://www.me3.cn)[1];  //得到值3ayQry  
  3. ShortUrl(http://www.me3.cn)[2];  //得到值UZzyUr  
  4. ShortUrl(http://www.me3.cn)[3];  //得到值36rQZn  


 

在存放這個URL的數據方面,我個人推薦TTServer,有的朋友可以沒有聽說過,下面是這個數據庫的介紹:

Tokyo Cabinet 是日本人 Mikio Hirabayashi(平林幹雄)のページ 開發的一款DBM數據庫(注:大名鼎鼎的DBM數據庫qdbm就是他開發的),該數據庫讀寫非常快。insert:0.4sec/1000000 recordes(2500000qps),寫入100萬數據只需要0.4秒。search:0.33sec/1000000 recordes (3000000 qps),讀取100萬數據只需要0.33秒。

可以看到對於字典類型的數據Key/Value的查詢,這個數據庫可以說是我目前見過效率非常高的,況且他如此的小巧,用來對short url/long url的配對再好不過。

 

該系統使用6個短碼字符來表示任何長度的網址。 有效的字符代碼是ASCII 'A'到'Z'和'0'的'5',其中每個字符包含2 ^ 5(32)狀態。  6短碼字符可用於繪制32 ^ 6(1073741824)的網址 

首先,你需要一個數據庫表來存儲和檢索你映射的網址。 

[html]  view plain copy print ? 在CODE上查看代碼片 派生到我的代碼片
 
  1. CREATE TABLE mappedURL (的CREATE TABLE mappedURL(   
  2. shortCode char(6) not null,   
  3. lognURL  text not null,   
  4. PRIMARY KEY  shortCodeInd (shortCode),   
  5. );   


其次,你需要定義一個算法將長的URL映射到短的URL。 算法上面已經介紹過了。

第三,你需要創建一個網頁,從數據庫的短網址的映射找到原始的URL,並重定向之。

更多 0


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM