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的