【轉(zhuǎn)】 微博短鏈接的生成算法(Java版本) (1)
2011-08-11 12:05
轉(zhuǎn)載自
分享最終編輯
yj327243832最近看到微博的短鏈接真是很火啊,新浪、騰訊、搜狐等微博網(wǎng)站都加入了短鏈接的功能。之所以要是使用短鏈接,主要是因?yàn)槲⒉┲辉试S發(fā)140 字,如果鏈接地址太長的話,那么發(fā)送的字?jǐn)?shù)將大大減少。短鏈接的主要職責(zé)就是把原始鏈接很長的地址壓縮成只有6 個字母的短鏈接地址,當(dāng)我們點(diǎn)擊這6 個字母的鏈接后,我們又可以跳轉(zhuǎn)到原始鏈接地址。
開始以為短鏈接是按照某種算法把原始鏈接壓縮為短鏈接,再根據(jù)算法從短鏈接反算成原始鏈接的。后來嘗試了下壓縮算法(gzip 壓縮算法),發(fā)現(xiàn)對于url 這種字符串越是壓縮,長度就越長。通過對壓縮算法的一些了解,發(fā)現(xiàn)靠壓縮算法來實(shí)現(xiàn)這個功能不太靠譜。
后來在網(wǎng)上找到一個生成算法,該算法主要使用MD5 算法對原始鏈接進(jìn)行加密(這里使用的MD5 加密后的字符串長度為32 位),然后對加密后的字符串進(jìn)行處理以得到短鏈接的地址。原始的算法是C# 版本的,這里我把該算法修改成Java 版本的. 算法的具體代碼如下,代碼中有注釋:
一、 代碼
package com.csdn.shorturl;
public class ShortUrlGenerator {
/**
* @param args
*/
public static void main(String[] args) {
// 長連接:
http://tech.sina.com.cn/i/2011-03-23/11285321288.shtml// 新浪解析后的短鏈接為:
http://t.cn/h1jGSCString sLongUrl = "
String[] aResult = shortUrl (sLongUrl);
// 打印出結(jié)果
for ( int i = 0; i < aResult. length ; i++) {
System. out .println( "[" + i + "]:::" + aResult[i]);
}
}
public static String[] shortUrl(String url) {
// 可以自定義生成 MD5 加密字符傳前的混合 KEY
String key = "wuguowei" ;
// 要使用生成 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"
};
// 對傳入網(wǎng)址進(jìn)行 MD5 加密
String sMD5EncryptResult = ( new CMyEncrypt()).getMD5OfStr(key + url);
String hex = sMD5EncryptResult;
String[] resUrl = new String[4];
for ( int i = 0; i < 4; i++) {
// 把加密字符按照 8 位一組 16 進(jìn)制與 0x3FFFFFFF 進(jìn)行位與運(yùn)算
String sTempSubString = hex.substring(i * 8, i * 8 + 8);
// 這里需要使用 long 型來轉(zhuǎn)換,因?yàn)?Inteper .parseInt() 只能處理 31 位 , 首位為符號位 , 如果不用 long ,則會越界
long lHexLong = 0x3FFFFFFF & Long.parseLong (sTempSubString, 16);
String outChars = "" ;
for ( int j = 0; j < 6; j++) {
// 把得到的值與 0x0000003D 進(jìn)行位與運(yùn)算,取得字符數(shù)組 chars 索引
long index = 0x0000003D & lHexLong;
// 把取得的字符相加
outChars += chars[( int ) index];
// 每次循環(huán)按位右移 5 位
lHexLong = lHexLong >> 5;
}
// 把字符串存入對應(yīng)索引的輸出數(shù)組
resUrl[i] = outChars;
}
return resUrl;
}
}
二、 輸出結(jié)果
執(zhí)行上面代碼的結(jié)果如下,會產(chǎn)生4 組6 位字符串,任意一組都可以作為當(dāng)前字符串的短鏈接地址。
[0]:::7nUFJn
[1]:::f6Zzy2
[2]:::j6jmQb
[3]:::2eAjea
三、 跳轉(zhuǎn)原理
當(dāng)我們生成短鏈接之后,只需要在表中(數(shù)據(jù)庫或者NoSql )存儲原始鏈接與短鏈接的映射關(guān)系即可。當(dāng)我們訪問短鏈接時,只需要從映射關(guān)系中找到原始鏈接,即可跳轉(zhuǎn)到原始鏈接。