程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C# URL短地址緊縮算法及短網址道理解析

C# URL短地址緊縮算法及短網址道理解析

編輯:C#入門知識

C# URL短地址緊縮算法及短網址道理解析。本站提示廣大學習愛好者:(C# URL短地址緊縮算法及短網址道理解析)文章只能為提供參考,不一定能成為您想要的結果。以下是C# URL短地址緊縮算法及短網址道理解析正文


短網址運用曾經在全國各年夜微博上開端風行了起來。例如QQ微博的url.cn,新郎的sinaurl.cn等。

我們在QQ微博上宣布網址的時刻,微博會主動辨別網址,並將其轉換,例如:http://url.cn/2hytQx

為何要如許做的,緣由我想有如許幾點:

微博限制字數為140字一條,那末假如我們須要發一些銜接上去,然則這個銜接異常的長,以致於快要要占用我們內容的一半篇幅,這確定是不克不及被許可的,所以短網址應運而生了。

短網址可以在我們項目裡可以很好的對開放級URL停止治理。有一部門網址可以會涵蓋暴力,告白等信息,如許我們可以經由過程用戶的告發,完整治理這個銜接將不湧現在我們的運用中,應為異樣的URL經由過程加密算法以後,獲得的地址是一樣的。

我們可以對一系列的網址停止流量,點擊等統計,發掘出年夜多半用戶的存眷點,如許有益於我們對項目標後續任務更好的作出決議計劃。

其實以上三點純屬小我不雅點,由於在我接上去的部門項目中會運用到,所以就懂得了一下,上面先來看看短網址映照算法的實際(網上找到的材料):

將長網址md5生成32位簽名串,分為4段,每段8個字節;
對這四段輪回處置,取8個字節,將他算作16進制串與0x3fffffff(30位1)與操作,即跨越30位的疏忽處置;
這30位分紅6段,每5位的數字作為字母表的索引獲得特定字符,順次停止取得6位字符串;
總的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.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的

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved