1. 程式人生 > 程式設計 >短網址的原理與生成方法(Java實現)

短網址的原理與生成方法(Java實現)

短網址應用已經在全國各大微博上開始流行了起來。例如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,這樣幾乎不會出現太大的重複。

下面來看看程式部分:

public static string[] ShortUrl(string url) 
{ 
 //可以自定義生成MD5加密字元傳前的混合KEY 
 string key = "Leejor"; 
 //要使用生成URL的字元 
 string[] chars = new string[]{ 
  "a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z" 
 }; 
 
 //對傳入網址進行MD5加密 
 string hex = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(key + url,"md5"); 
 
 string[] resUrl = new string[4]; 
 
 for (int i = 0; i < 4; i++) 
 { 
  //把加密字元按照8位一組16進位制與0x3FFFFFFF進行位與運算 
  int hexint = 0x3FFFFFFF & Convert.ToInt32("0x" + hex.Substring(i * 8,8),16); 
  string outChars = string.Empty; 
  for (int j = 0; j < 6; j++) 
  { 
   //把得到的值與0x0000003D進行位與運算,取得字元陣列chars索引 
   int index = 0x0000003D & hexint; 
   //把取得的字元相加 
   outChars += chars[index]; 
   //每次迴圈按位右移5位 
   hexint = hexint >> 5; 
  } 
  //把字串存入對應索引的輸出陣列 
  resUrl[i] = outChars; 
 } 
 return resUrl; 
} 

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

ShortUrl(http://www.me3.cn)[0]; //得到值fAVfui 
ShortUrl(http://www.me3.cn)[1]; //得到值3ayQry 
ShortUrl(http://www.me3.cn)[2]; //得到值UZzyUr 
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)的網址

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

CREATE TABLE mappedURL (的CREATE TABLE mappedURL( 
shortCode char(6) not null,lognURL text not null,PRIMARY KEY shortCodeInd (shortCode),); 

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

第三,你需要建立一個網頁,從資料庫的短網址的對映找到原始的URL,並重定向之。

總結

到此這篇關於短網址的原理與生成方法的文章就介紹到這了,更多相關短網址的原理與生成內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!