【轉】C# URL短地址壓縮算法及短網址原理解析

這篇文章主要介紹了C# URL短地址壓縮算法及短網址原理解析,本文重點給出了算法代碼,須要的朋友能夠參考下算法

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

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

爲何要這樣作的,緣由我想有這樣幾點:數據結構

微博限制字數爲140字一條,那麼若是咱們須要發一些鏈接上去,可是這個鏈接很是的長,以致於將近要佔用咱們內容的一半篇幅,這確定是不能被容許的,因此短網址應運而生了。app

短網址能夠在咱們項目裏能夠很好的對開放級URL進行管理。有一部分網址能夠會涵蓋暴力,廣告等信息,這樣咱們能夠經過用戶的舉報,徹底管理這個鏈接將不出如今咱們的應用中,應爲一樣的URL經過加密算法以後,獲得的地址是同樣的。ui

咱們能夠對一系列的網址進行流量,點擊等統計,挖掘出大多數用戶的關注點,這樣有利於咱們對項目的後續工做更好的做出決策。加密

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

將長網址md5生成32位簽名串,分爲4段,每段8個字節;
對這四段循環處理,取8個字節,將他當作16進制串與0x3fffffff(30位1)與操做,即超過30位的忽略處理;
這30位分紅6段,每5位的數字做爲字母表的索引取得特定字符,依次進行得到6位字符串;
總的md5串能夠得到4個6位串;取裏面的任意一個就可做爲這個長url的短url地址;
很簡單的理論,咱們並不必定說獲得的URL是惟一的,可是咱們可以取出4組URL,這樣幾乎不會出現太大的重複。spa

下面來看看程序部分:.net

複製代碼 代碼以下:

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.jb51.net)[0];  //獲得值fAVfui
ShortUrl(http://www.jb51.net)[1];  //獲得值3ayQry
ShortUrl(http://www.jb51.net)[2];  //獲得值UZzyUr
ShortUrl(http://www.jb51.net)[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,並重定向之。

———————————————————

MD5 已經被破解了,所以不排除攻擊者僞造相同 MD5 的 url 實現惡意目的的可能性。若是不考慮這種狀況,md5 collision 的可能性應該是及其低的,估計你我有生之年都看不到。

另外偶不明白「相同的URL每次算出來的鍵值必須都是同樣的」的實際用途會是什麼。就算相同的 URL 對應不一樣的鍵值,通常也不會形成太大的浪費吧?只有 6 位的字母數字組合均可以容納幾十億種變化。

我正是有md5 collision的擔憂才問這個問題的。相同的URL要對應相同的鍵值是由於每個URL地址都須要惟一的對應到數據庫中的一條表數據,但直接用URL來查詢會比較慢,由於:

將要存儲的URL和相關的記錄數據量很是大。
並且有些URL會很長,因此要用text字段。
而若是哈希出惟一的鍵值用varchar來存儲,再根據這個鍵值去查詢就會很是方便快捷。

就像Git裏面的object hash, 目前基本上不用考慮衝突吧。

bit.ly等url shorter服務是怎麼實現的?
需不須要從hash鍵值反向查找url? 若是有這樣的要求, url確定須要存一個地方, 這樣就能夠在衝突的時候進行再散列
MD5是128位hash碼(4個整數,每一個整數4個字節)。所以,一個url的MD5碼,有2的128次方(即2e128)個可能。隨意找出來的兩個url的MD5碼相等的可能性,是2e128分之一,即r=2e-128

假如url經MD5後插入數據庫,第一個url插入的不會發生重複,第二個MD5插入時,它跟第一條重複的機率是r。第三條url插入時,重複機率 是2×r,以此類推,第n條插入時發生重複的機率是(n-1)×r。n個MD5碼,其中有兩個重複的機率是這些機率加和。(1+2+3+…+(n- 1))×r = (1/2)×n×(n-1)×r

對於n個MD5碼的集合,存在重複的機率是(1/2)*(n/2e64)e2

所以,只有n大到能夠與2e64比擬,才須要考慮它的衝突問題。而2的64次方仍是很大的。

因此,只要不是惡意攻擊,通常應用是不太會有collision的

 

轉載自:http://blog.csdn.net/lansetiankong12/article/details/49024357

相關文章
相關標籤/搜索