各大微博短網址(ShortUrl)的演算法 C#

來源:互聯網
上載者:User

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

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

為什麼要這樣做的,原因我想有這樣幾點:

1、微博限制字數為140字一條,那麼如果我們需要發一些串連上去,但是這個串連非常的長,以至於將近要佔用我們內容的一半篇幅,這肯定是不能被允許的,所以短網址應運而生了。

2、短網址可以在我們項目裡可以很好的對開放級URL進行管理。有一部分網址可以會涵蓋色情,暴力,廣告等資訊,這樣我們可以通過使用者的舉報,完全管理這個串連將不出現在我們的應用中,應為同樣的URL通過密碼編譯演算法之後,得到的地址是一樣的。

3、我們可以對一系列的網址進行流量,點擊等統計,挖掘出大多數使用者的關注點,這樣有利於我們對項目的後續工作更好的作出決策。

 

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

1)將長網址md5產生32位簽名串,分為4段, 每段8個位元組;
2)對這四段迴圈處理, 取8個位元組, 將他看成16進位串與0x3fffffff(30位1)與操作, 即超過30位的忽略處理;
3)這30位分成6段, 每5位的數字作為字母表的索引取得特定字元, 依次進行獲得6位字串;
4)總的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.me3.cn")[0];  //得到值fAVfui

ShortUrl("http://www.me3.cn")[1];  //得到值3ayQry

ShortUrl("http://www.me3.cn")[2];  //得到值UZzyUr

ShortUrl("http://www.me3.cn")[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的配對再好不過。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.