短網址的原理和實現


微博上經常會看到類似 http://t.cn/Afafhe 這樣的短地址 
那么實現原理是什么呢 

其實很簡單 ,系統把一個長的地址 如 http://www.xxx.com/ddd/xxx/a.html?dsada 
首先用一個算法轉換成 短地址 http://t.cn/Afafhe 
然后把  Afafhe-->http://www.xxx.com/ddd/xxx/a.html?dsada 的關系保存到數據庫中 

當用戶訪問 http://t.cn/Afafhe網址時,系統到數據庫找到對應的URL地址,實現跳轉 

那么我們要知道的1、算法 2、系統的存儲方式 

首先看算法吧,網上搜索了下,大致是用MD5什么的生成的 ,其實這個算法主要是把長字符串變小 ,這個算法是不可逆的,所以別想着去直接反轉短地址 
要詳細看算法的 可以到網上搜索資料 

2、系統的存儲方式 ,如果我們自己寫着玩,那直接找個SQL Server 或者MySql 之類的就可以,但是想新浪微博之類的大型網站,那個數據量是非常巨大的,我想他們應該用的NoSql 非關系型數據庫(應該也就是人們說的分布式數據庫 ),一些開源的  如Facebook 的Cassandra, Apache 的HBase,也得到了廣泛認同。從這些NoSQL項目的名字上看不出什么相同之處:Hadoop、Voldemort、Dynomite,還有其它很多。、 
http://baike.baidu.com/view/2677528.htm 

Java的短地址算法 

Java代碼   收藏代碼
  1. package work13;  
  2.   
  3. import java.security.MessageDigest;  
  4.   
  5. public class CMyEncrypt  
  6. {  
  7.     // 十六進制下數字到字符的映射數組  
  8.     private final static String[] hexDigits = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D",  
  9.             "E", "F" };  
  10.   
  11.     /** 把inputString加密 */  
  12.     public static String md5(String inputStr)  
  13.     {  
  14.         return encodeByMD5(inputStr);  
  15.     }  
  16.   
  17.     /** 
  18.      * 驗證輸入的密碼是否正確 
  19.      *  
  20.      * @param password 
  21.      *            真正的密碼(加密后的真密碼) 
  22.      * @param inputString 
  23.      *            輸入的字符串 
  24.      * @return 驗證結果,boolean類型 
  25.      */  
  26.     public static boolean authenticatePassword(String password, String inputString)  
  27.     {  
  28.         if (password.equals(encodeByMD5(inputString)))  
  29.         {  
  30.             return true;  
  31.         } else  
  32.         {  
  33.             return false;  
  34.         }  
  35.     }  
  36.   
  37.     /** 對字符串進行MD5編碼 */  
  38.     private static String encodeByMD5(String originString)  
  39.     {  
  40.         if (originString != null)  
  41.         {  
  42.             try  
  43.             {  
  44.                 // 創建具有指定算法名稱的信息摘要  
  45.                 MessageDigest md5 = MessageDigest.getInstance("MD5");  
  46.                 // 使用指定的字節數組對摘要進行最后更新,然后完成摘要計算  
  47.                 byte[] results = md5.digest(originString.getBytes());  
  48.                 // 將得到的字節數組變成字符串返回  
  49.                 String result = byteArrayToHexString(results);  
  50.                 return result;  
  51.             } catch (Exception e)  
  52.             {  
  53.                 e.printStackTrace();  
  54.             }  
  55.         }  
  56.         return null;  
  57.     }  
  58.   
  59.     /** 
  60.      * 輪換字節數組為十六進制字符串 
  61.      *  
  62.      * @param b 
  63.      *            字節數組 
  64.      * @return 十六進制字符串 
  65.      */  
  66.     private static String byteArrayToHexString(byte[] b)  
  67.     {  
  68.         StringBuffer resultSb = new StringBuffer();  
  69.         for (int i = 0; i < b.length; i++)  
  70.         {  
  71.             resultSb.append(byteToHexString(b[i]));  
  72.         }  
  73.         return resultSb.toString();  
  74.     }  
  75.   
  76.     // 將一個字節轉化成十六進制形式的字符串  
  77.     private static String byteToHexString(byte b)  
  78.     {  
  79.         int n = b;  
  80.         if (n < 0)  
  81.             n = 256 + n;  
  82.         int d1 = n / 16;  
  83.         int d2 = n % 16;  
  84.         return hexDigits[d1] + hexDigits[d2];  
  85.     }  
  86.   
  87.     public static void main(String[] args)  
  88.     {  
  89.         CMyEncrypt.md5("http://tech.sina.com.cn/i/2011-03-23/11285321288.shtml");  
  90.     }  
  91. }  



Java代碼   收藏代碼
  1. package work13;  
  2.   
  3. public class ShortUrlGenerator  
  4. {  
  5.   
  6.     /** 
  7.      * @param args 
  8.      */  
  9.     public static void main(String[] args)  
  10.     {  
  11.   
  12.         String sLongUrl = "http://xxx.qzone.qq.com/dsa/fds/gf/hgf/hgf?dsada=dsada"; // 長鏈接  
  13.         String[] aResult = shortUrl(sLongUrl);  
  14.         // 打印出結果  
  15.         for (int i = 0; i < aResult.length; i++)  
  16.         {  
  17.             System.out.println("[" + i + "]:::" + aResult[i]);  
  18.         }  
  19.     }  
  20.   
  21.     public static String[] shortUrl(String url)  
  22.     {  
  23.         // 可以自定義生成 MD5 加密字符傳前的混合 KEY  
  24.         String key = "mengdelong";  
  25.         // 要使用生成 URL 的字符  
  26.         String[] chars = new String[] { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p",  
  27.                 "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9",  
  28.                 "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T",  
  29.                 "U", "V", "W", "X", "Y", "Z"  
  30.   
  31.         };  
  32.         // 對傳入網址進行 MD5 加密  
  33.         String sMD5EncryptResult = (new CMyEncrypt()).md5(key + url);  
  34.         String hex = sMD5EncryptResult;  
  35.   
  36.         String[] resUrl = new String[4];  
  37.         for (int i = 0; i < 4; i++)  
  38.         {  
  39.   
  40.             // 把加密字符按照 8 位一組 16 進制與 0x3FFFFFFF 進行位與運算  
  41.             String sTempSubString = hex.substring(i * 8, i * 8 + 8);  
  42.   
  43.             // 這里需要使用 long 型來轉換,因為 Inteper .parseInt() 只能處理 31 位 , 首位為符號位 , 如果不用  
  44.             // long ,則會越界  
  45.             long lHexLong = 0x3FFFFFFF & Long.parseLong(sTempSubString, 16);  
  46.             String outChars = "";  
  47.             for (int j = 0; j < 6; j++)  
  48.             {  
  49.                 // 把得到的值與 0x0000003D 進行位與運算,取得字符數組 chars 索引  
  50.                 long index = 0x0000003D & lHexLong;  
  51.                 // 把取得的字符相加  
  52.                 outChars += chars[(int) index];  
  53.                 // 每次循環按位右移 5 位  
  54.                 lHexLong = lHexLong >> 5;  
  55.             }  
  56.             // 把字符串存入對應索引的輸出數組  
  57.             resUrl[i] = outChars;  
  58.         }  
  59.         return resUrl;  
  60.     }  
  61. }  





參考:http://iteye.blog.163.com/blog/static/1863080962012111223141936/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM