這篇文章主要介紹了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
如今能夠直接使用該方法,能夠等到下面四組值:
在存放這個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)的網址
首先,你須要一個數據庫表來存儲和檢索你映射的網址。
其次,你須要定義一個算法將長的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