最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C# URL短地址壓縮算法及短網(wǎng)址原理解析

 更新時(shí)間:2015年03月16日 10:48:10   投稿:junjie  
這篇文章主要介紹了C# URL短地址壓縮算法及短網(wǎng)址原理解析,本文重點(diǎn)給出了算法代碼,需要的朋友可以參考下

短網(wǎng)址應(yīng)用已經(jīng)在全國各大微博上開始流行了起來。例如QQ微博的url.cn,新郎的sinaurl.cn等。

我們在QQ微博上發(fā)布網(wǎng)址的時(shí)候,微博會(huì)自動(dòng)判別網(wǎng)址,并將其轉(zhuǎn)換,例如:http://url.cn/2hytQx

為什么要這樣做的,原因我想有這樣幾點(diǎn):

微博限制字?jǐn)?shù)為140字一條,那么如果我們需要發(fā)一些連接上去,但是這個(gè)連接非常的長,以至于將近要占用我們內(nèi)容的一半篇幅,這肯定是不能被允許的,所以短網(wǎng)址應(yīng)運(yùn)而生了。

短網(wǎng)址可以在我們項(xiàng)目里可以很好的對(duì)開放級(jí)URL進(jìn)行管理。有一部分網(wǎng)址可以會(huì)涵蓋暴力,廣告等信息,這樣我們可以通過用戶的舉報(bào),完全管理這個(gè)連接將不出現(xiàn)在我們的應(yīng)用中,應(yīng)為同樣的URL通過加密算法之后,得到的地址是一樣的。

我們可以對(duì)一系列的網(wǎng)址進(jìn)行流量,點(diǎn)擊等統(tǒng)計(jì),挖掘出大多數(shù)用戶的關(guān)注點(diǎn),這樣有利于我們對(duì)項(xiàng)目的后續(xù)工作更好的作出決策。

其實(shí)以上三點(diǎn)純屬個(gè)人觀點(diǎn),因?yàn)樵谖医酉聛淼牟糠猪?xiàng)目中會(huì)應(yīng)用到,所以就了解了一下,下面先來看看短網(wǎng)址映射算法的理論(網(wǎng)上找到的資料):

將長網(wǎng)址md5生成32位簽名串,分為4段,每段8個(gè)字節(jié);
對(duì)這四段循環(huán)處理,取8個(gè)字節(jié),將他看成16進(jìn)制串與0x3fffffff(30位1)與操作,即超過30位的忽略處理;
這30位分成6段,每5位的數(shù)字作為字母表的索引取得特定字符,依次進(jìn)行獲得6位字符串;
總的md5串可以獲得4個(gè)6位串;取里面的任意一個(gè)就可作為這個(gè)長url的短url地址;
很簡單的理論,我們并不一定說得到的URL是唯一的,但是我們能夠取出4組URL,這樣幾乎不會(huì)出現(xiàn)太大的重復(fù)。

下面來看看程序部分:

復(fù)制代碼 代碼如下:

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(jiān)” , ”P” , ”Q” , ”R” , ”S” , ”T” ,
        ”U” , ”V” , ”W” , ”X” , ”Y” , ”Z”
    };
    //對(duì)傳入網(wǎng)址進(jìn)行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進(jìn)制與0x3FFFFFFF進(jìn)行位與運(yùn)算
        int  hexint = 0x3FFFFFFF & Convert.ToInt32( ”0x”  + hex.Substring(i * 8, 8), 16);
        string  outChars =  string .Empty;
        for  ( int  j = 0; j < 6; j++)
        {
            //把得到的值與0x0000003D進(jìn)行位與運(yùn)算,取得字符數(shù)組chars索引
            int  index = 0x0000003D & hexint;
            //把取得的字符相加
            outChars += chars[index];
            //每次循環(huán)按位右移5位
            hexint = hexint >> 5;
        }
        //把字符串存入對(duì)應(yīng)索引的輸出數(shù)組
        resUrl[i] = outChars;
    }
    return  resUrl;
}

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

復(fù)制代碼 代碼如下:

ShortUrl(http://m.fzitv.net)[0];  //得到值fAVfui
ShortUrl(http://m.fzitv.net)[1];  //得到值3ayQry
ShortUrl(http://m.fzitv.net)[2];  //得到值UZzyUr
ShortUrl(http://m.fzitv.net)[3];  //得到值36rQZn

 
在存放這個(gè)URL的數(shù)據(jù)方面,我個(gè)人推薦TTServer,有的朋友可以沒有聽說過,下面是這個(gè)數(shù)據(jù)庫的介紹:

Tokyo Cabinet 是日本人 Mikio Hirabayashi(平林幹雄)のページ 開發(fā)的一款DBM數(shù)據(jù)庫(注:大名鼎鼎的DBM數(shù)據(jù)庫qdbm就是他開發(fā)的),該數(shù)據(jù)庫讀寫非常快。insert:0.4sec/1000000 recordes(2500000qps),寫入100萬數(shù)據(jù)只需要0.4秒。search:0.33sec/1000000 recordes (3000000 qps),讀取100萬數(shù)據(jù)只需要0.33秒。

可以看到對(duì)于字典類型的數(shù)據(jù)Key/Value的查詢,這個(gè)數(shù)據(jù)庫可以說是我目前見過效率非常高的,況且他如此的小巧,用來對(duì)short url/long url的配對(duì)再好不過。

該系統(tǒng)使用6個(gè)短碼字符來表示任何長度的網(wǎng)址。 有效的字符代碼是ASCII ‘A'到'Z'和'0′的'5′,其中每個(gè)字符包含2 ^ 5(32)狀態(tài)。  6短碼字符可用于繪制32 ^ 6(1073741824)的網(wǎng)址

首先,你需要一個(gè)數(shù)據(jù)庫表來存儲(chǔ)和檢索你映射的網(wǎng)址。

復(fù)制代碼 代碼如下:

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

其次,你需要定義一個(gè)算法將長的URL映射到短的URL。 算法上面已經(jīng)介紹過了。

第三,你需要?jiǎng)?chuàng)建一個(gè)網(wǎng)頁,從數(shù)據(jù)庫的短網(wǎng)址的映射找到原始的URL,并重定向之。

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

MD5 已經(jīng)被破解了,因此不排除攻擊者偽造相同 MD5 的 url 實(shí)現(xiàn)惡意目的的可能性。如果不考慮這種情況,md5 collision 的可能性應(yīng)該是及其低的,估計(jì)你我有生之年都看不到。

另外偶不明白“相同的URL每次算出來的鍵值必須都是一樣的”的實(shí)際用途會(huì)是什么。就算相同的 URL 對(duì)應(yīng)不同的鍵值,一般也不會(huì)造成太大的浪費(fèi)吧?只有 6 位的字母數(shù)字組合都可以容納幾十億種變化。

我正是有md5 collision的擔(dān)心才問這個(gè)問題的。相同的URL要對(duì)應(yīng)相同的鍵值是因?yàn)槊恳粋€(gè)URL地址都需要唯一的對(duì)應(yīng)到數(shù)據(jù)庫中的一條表數(shù)據(jù),但直接用URL來查詢會(huì)比較慢,因?yàn)椋?/p>

將要存儲(chǔ)的URL和相關(guān)的記錄數(shù)據(jù)量非常大。
而且有些URL會(huì)很長,所以要用text字段。
而如果哈希出唯一的鍵值用varchar來存儲(chǔ),再根據(jù)這個(gè)鍵值去查詢就會(huì)非常方便快捷。

就像git里面的object hash, 目前基本上不用考慮沖突吧。

bit.ly等url shorter服務(wù)是怎么實(shí)現(xiàn)的?
需不需要從hash鍵值反向查找url? 如果有這樣的要求, url肯定需要存一個(gè)地方, 這樣就可以在沖突的時(shí)候進(jìn)行再散列
MD5是128位hash碼(4個(gè)整數(shù),每個(gè)整數(shù)4個(gè)字節(jié))。因此,一個(gè)url的MD5碼,有2的128次方(即2e128)個(gè)可能。隨意找出來的兩個(gè)url的MD5碼相等的可能性,是2e128分之一,即r=2e-128

假如url經(jīng)MD5后插入數(shù)據(jù)庫,第一個(gè)url插入的不會(huì)發(fā)生重復(fù),第二個(gè)MD5插入時(shí),它跟第一條重復(fù)的概率是r。第三條url插入時(shí),重復(fù)概率 是2×r,以此類推,第n條插入時(shí)發(fā)生重復(fù)的概率是(n-1)×r。n個(gè)MD5碼,其中有兩個(gè)重復(fù)的概率是這些概率加和。(1+2+3+…+(n- 1))×r = (1/2)×n×(n-1)×r

對(duì)于n個(gè)MD5碼的集合,存在重復(fù)的概率是(1/2)*(n/2e64)e2

因此,只有n大到可以與2e64比擬,才需要考慮它的沖突問題。而2的64次方還是很大的。

所以,只要不是惡意攻擊,一般應(yīng)用是不太會(huì)有collision的

相關(guān)文章

  • C# 鍵值對(duì)數(shù)據(jù)排序代碼

    C# 鍵值對(duì)數(shù)據(jù)排序代碼

    這篇文章介紹了C# 鍵值對(duì)數(shù)據(jù)排序代碼,有需要的朋友可以參考一下
    2013-11-11
  • C#調(diào)用webservice接口的最新方法教程

    C#調(diào)用webservice接口的最新方法教程

    webservice 可以用于分布式應(yīng)用程序之間的交互,和不同程序之間的交互。下面這篇文章主要給大家介紹了關(guān)于C#調(diào)用webservice接口的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友下面隨著小編來一起看看吧。
    2017-11-11
  • C#?泛型集合類List<T>使用總結(jié)

    C#?泛型集合類List<T>使用總結(jié)

    本文主要主要介紹了C#?泛型集合類List<T>使用總結(jié),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧<BR>
    2022-05-05
  • C#引用類型轉(zhuǎn)換的常見方式總結(jié)

    C#引用類型轉(zhuǎn)換的常見方式總結(jié)

    這篇文章主要介紹了C#引用類型轉(zhuǎn)換的常見方式,包括子類轉(zhuǎn)換成父類,父類轉(zhuǎn)換成子類,以及不是子父級(jí)關(guān)系類之間的轉(zhuǎn)換,需要的朋友可以參考下
    2014-09-09
  • 使用C# 調(diào)用deepseek api接口實(shí)現(xiàn)正常訪問的過程

    使用C# 調(diào)用deepseek api接口實(shí)現(xiàn)正常訪問的過程

    本文介紹了使用C#調(diào)用deepseek API接口實(shí)現(xiàn)正常訪問的方法,包括解決SSL/TLS安全通道問題和切換模型等常見問題,并提供了默認(rèn)使用的reasoner模型和賬戶余額信息,感興趣的朋友一起看看吧
    2025-02-02
  • 在C#中對(duì)TCP客戶端的狀態(tài)封裝詳解

    在C#中對(duì)TCP客戶端的狀態(tài)封裝詳解

    本篇文章小編為大家介紹,在C#中對(duì)TCP客戶端的狀態(tài)封裝詳解,需要的朋友參考下
    2013-04-04
  • C#中的XML與JSON數(shù)據(jù)處理的案例詳解

    C#中的XML與JSON數(shù)據(jù)處理的案例詳解

    在現(xiàn)代軟件開發(fā)中,數(shù)據(jù)交換和存儲(chǔ)的需求日益增長,而 XML 和 JSON 成為了兩種最常用的數(shù)據(jù)格式,它們各有特點(diǎn),在不同的場景下有著各自的優(yōu)勢,本文將從 C# 的角度出發(fā),探討如何處理這兩種數(shù)據(jù)格式,并分享一些常見的問題及解決方法,需要的朋友可以參考下
    2024-09-09
  • c# 獲取字符串的字節(jié)數(shù)的方法

    c# 獲取字符串的字節(jié)數(shù)的方法

    本篇文章主要是對(duì)c#中獲取字符串的字節(jié)數(shù)的方法進(jìn)行了介紹,需要的朋友可以過來參考下,希望對(duì)大家有所幫助
    2014-01-01
  • C#實(shí)現(xiàn)圍棋游戲

    C#實(shí)現(xiàn)圍棋游戲

    這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)圍棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • C#實(shí)現(xiàn)自定義屏保的示例代碼

    C#實(shí)現(xiàn)自定義屏保的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用C#實(shí)現(xiàn)自定義屏保的功能,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下
    2022-12-12

最新評(píng)論

额敏县| 泸州市| 鹤庆县| 宜都市| 高唐县| 溆浦县| 岑巩县| 叙永县| 沧源| 天津市| 本溪| 扬州市| 邮箱| 新乡市| 东至县| 玉龙| 山东省| 锦州市| 天全县| 淳安县| 开平市| 吴江市| 隆安县| 边坝县| 铁岭市| 泰顺县| 天等县| 元阳县| 滦南县| 东辽县| 武邑县| 永清县| 博客| 乐亭县| 汝州市| 绵阳市| 抚松县| 株洲县| 仪征市| 鱼台县| 肥城市|