前些天在做一個新浪微博的應用,在把應用測試的內容發佈到新浪微博的時候,發現應用測試的鏈接地址變成http://t.cn/xxxxxx啦 ,點擊鏈接又跳轉到了應用測試地址,於是生了個念頭[弄清楚是怎麼回事?]。
原來我們發微博的時候有字數的限制,如果發佈的微博內容包含網址,而網址會佔一定的長度,這就給發佈內容的字數上有了限制,我想新浪微博爲了更好的用戶體驗而找出解決這個問題的方法就是把原網址根據算法變短。下面是在網上查到資料[短網址映射算法的理論]:
(1)、將長地址根據MD5生成32位簽名串,每段8個字節。
(2)、對這四段循環處理, 取8個字節, 將他看成16進制串與0x3fffffff(30位1)與操作, 即超過30位的忽略處理;
(3)、這30位分成6段, 每5位的數字作爲字母表的索引取得特定字符, 依次進行獲得6位字符串;
(4)、總的md5串可以獲得4個6位串; 取裏面的任意一個就可作爲這個長url的短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("URL")[0],ShortUrl("URL")[1],ShortUrl("URL")[2],ShortUrl("URL")[3]。
以上算法以及代碼均來源於網絡資料;
上面還有兩個問題比較模糊的是進制轉換和位運算[從沒用過];