短址(short URL)原理及其實現
前言
最近看了一些關於短址(short URL)方面的一些部落格,有些部落格說到一些好的東西,但是,也不是很全,所以,這篇部落格算是對其它部落格的一個總結吧。
介紹
短址,顧名思義,就是把長的 URL 轉成短的 URL, 現在提供這種服務的有很多公司,我們以google家的 URL shortener 服務: http://goo.gl/ 為例。
首先我們到 http://goo.gl/,然後把本文部落格的地址http://blog.csdn.net/beiyeqingteng 輸入進去,最後它會返回一個更短的URL,http://goo.gl/Jfs6q 。如下圖所示:
URL 解析
當我們在瀏覽器裡輸入 http://goo.gl/Jfs6q 時,DNS首先解析獲得http://goo.gl/的IP地址。當DNS獲得IP地址以後(比如:74.125.225.72),會向這個地址傳送HTTP GET請求,查詢 Jfs6q, 這個時候,http://goo.gl/伺服器會把請求通過HTTP 301轉到對應的長URL http://blog.csdn.net/beiyeqingteng 。後面的解析過程就和平常網址解析是一樣的了。
短址本質
短址本質上是實現了一個對映函式 f: X -> Y 。而這個對映函式必須同時具有兩個特點:
-
如果 x1 != x2, 則 f (x1) != f(x2);
-
對於每一個 y, 能夠找到唯一的一個 x 使得 f(x) = y;
對於任何的線性函式,比如 f(x) = 2x,都滿足這樣的條件。
好了,如果瞭解了短址的本質,我們再來看它是如何實現的。
註明:在google URL shortener 服務中,它允許一個長 url 對應多個短的url。這可能是出於安全上的考慮。在本文中,我們不考慮這種情況。
實現:
短址的長度一般設為 6 位,而每一位是由 [a - z, A - Z, 0 - 9] 總共 62 個字母組成的,所以6位的話,總共會有 62^6 ~= 568億種組合,基本上夠用了。在google URL shortener 服務中,短址長度為 5,大概有9億多種組合.
假設我們用資料庫來儲存長地址和短地址的對映,那麼,在表 LongtoShortURL 中,我們會有三列:
1. ID,int, 自動增長;
2. LURL,varchar, // 長URL;
3. SURL, varchar, // 短URL。
現在我們考慮通過如何長URL得到唯一的短URL。
在講具體演算法以前,先提一個問題:10進位制數和16進位制數之間的轉換是否滿足剛剛提到的對映函式 f: X -> Y中的兩個條件?
答案: 是。
本文的思路也是利用進位制之間的轉換。因為我們總共有 62 個字母,我們可以自創一種進位制,叫做 62 進位制。其規則如下:
0 → a
1 → b
...
25 → z
...
52 → 0
61 → 9
所以,對於每一個長地址,我們可以根據它的ID,得到一個6位的 62 進位制數,這個6位的 62 進位制數就是我們的短址。具體實現如下:
public ArrayList<Integer> base62(int id) {
ArrayList<Integer> value = new ArrayList<Integer>();
while (id > 0) {
int remainder = id % 62;
value.add(remainder);
id = id / 62;
}
return value;
}
舉例
對於 ID = 138,通過 base62(138), 我們得到 value = [14, 2]。根據上面的對應規則表,我們可以得到其對應的短址為:aaaabn 。(由 value 得到具體的短址,可以通過switch 語句得到,因為程式碼太長,在此略過。)
當我們想通過短址找到所對應的長地址,方法也很簡單,就是把62進位制數轉成10進位制數即可,這樣我們就可以得到長地址的ID了。程式碼如下:
public static int base10(ArrayList<Integer> base62) {
//make sure the size of base62 is 6
for (int i = 1; i <= 6 - base62.size(); i++) {
base62.add(0, 0);
}
int id = 0;
int size = base62.size();
for (int i = 0; i < size; i++) {
int value = base62.get(i);
id += (int) (value * Math.pow(62, size - i - 1));
}
return id;
}
比如,對於短址aaae9a,其62進製為[0, 0, 0, 4,61,0] ,則其長地址的ID 為[0, 0, 0, 4,61,0] = 0×62^5+ 0×62^4 + 0×62^3 + 4×62^2 + 61×62^1 + 0×62^0 = 1915810。有了ID,我們自然就可以得到長地址了。
參考資料
http://stackoverflow.com/questions/742013/how-to-code-a-url-shortener (本文演算法來源)
http://blog.sina.com.cn/s/blog_65db99840100lg4n.html
感謝您的關注!可加QQ1群:135430763(2000人群已滿),QQ2群:454796847,QQ3群:187424846。QQ群進群密碼:xttblog,想加微信群的朋友,可以微信搜尋:xmtxtt,備註:“xttblog”,新增助理微信拉你進群。備註錯誤不會同意好友申請。再次感謝您的關注!後續有精彩內容會第一時間發給您!原創文章投稿請傳送至532009913@qq.com郵箱。商務合作可新增助理微信進行溝通!
相關文章
- url.cn短網址 url.cn短網址網址縮短教程
- url.cn短網址 騰訊url.cn短網址生成介面
- URL短網址線上生成工具
- 微信短網址 微信短網址(url.cn)線上生成介面
- 微信url短網址線上生成 最新微信短網址生成平臺推薦
- 騰訊短網址(url.cn短網址) 2020最新騰訊短網址生成api介面推薦API
- 騰訊短網址(url.cn)新浪短網址(t.cn)的API介面分享API
- URL短網址系統的演算法設計及實踐演算法
- AOP如何實現及其原理
- 最新最穩定的騰訊短網址(URL短連結)API介面分享API
- mongodb短網址專案02具體實現MongoDB
- 實現長連結轉化成短連結(新浪T.CN短連結以及騰訊URL.cn短網址)API介面程式碼分享API
- 騰訊短連結url生成介面/騰訊短網址線上生成/新浪微博短連結生成器的分享
- python用兩種方法實現url短連線Python
- 推薦幾個最新的騰訊URL短網址以及新浪TCN短連線的API介面API
- 深入理解Vue的watch實現原理及其實現方式Vue
- 理解https中的安全及其實現原理HTTP
- 京東短網址高可用提升最佳實踐
- 深入理解Vue的computed實現原理及其實現方式Vue
- 長 URL 轉短連結的簡單設計與實現
- 短網址安全淺談
- Google短網址的APIGoAPI
- 蟻群演算法原理及其實現(python)演算法Python
- Java併發程式設計:Synchronized及其實現原理Java程式設計synchronized
- 四位計算機的原理及其實現計算機
- 如何利用新浪官方的短網址API介面實現T.cn短連結的壓縮生成API
- T.CN短網址 新浪T.CN短網址生成工具推薦
- W外鏈 短網址系統API 原始碼,網址縮短API介面API原始碼
- 網址(URL)的詳細解析
- t.cn短網址 新浪短網址連結生成器的技術原理分析推薦第一章(分析篇)
- 如何縮短淘寶客連結網址 淘客短網址線上生成教程
- W外鏈短網址生成,他們家的短網址免費的嗎?
- 聊聊keep-alive元件的使用及其實現原理Keep-Alive元件
- JuiceFS CSI:Mount Pod 的平滑升級及其實現原理UI
- App Store 隱私政策網址(URL)APP
- iPhone快速新增網址URL字尾iPhone
- Java實現將文字內容、網址連結url,生成二維碼與反解析Java
- Java日誌框架:slf4j作用及其實現原理Java框架