短網址服務的原理是什麼?

那麼小的長度應該有一定概率會重複的吧?是不是一定時間後就不可用了?


短網址(Short URL),顧名思義就是在形式上比較短的網址。通常用的是asp或者php轉向,在Web 2.0的今天,不得不說,這是一個潮流。目前已經有許多類似服務,藉助短網址您可以用簡短的網址替代原來冗長的網址,讓使用者可以更容易的分享鏈接。

例如:http://t.cn/SzjPjA

短網址服務,可能很多朋友都已經不再陌生,現在大部分微博、手機郵件提醒等地方已經有很多應用模式了,並佔據了一定的市場。估計很多朋友現在也正在使用。

看過新浪的短連接服務,發現後面主要有6個字元串組成,於是第一個想到的就是原來公司寫的一個遊戲激活碼規則,也就是下面的演算法2,

26個大寫字母 26小寫字母,10個數字,隨機生成6個然後插入資料庫對應一個id,短連接跳轉的時候,根據字元串查詢到對應id,即可實現相應的跳轉!不過2的62次方,不知道有沒有重複的,小概率可以,但是對應不是很大的網站應該足夠了

自從twitter推出短網址(shorturl),繼之國內各大微博跟風,google公開goo.gl使用API,短網址之風愈演愈烈.不得不說這是一個新興又一大熱門web2.0服務.現整理一下,包括完整短網址網站,短網址生成原理,演算法舉例,以及優劣比較。

短鏈接的好處

1、內容需要;2、用戶友好;3、便於管理。

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

  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地址;

這種演算法,雖然會生成4個,但是仍然存在重複幾率,下面的演算法一和三,就是這種的實現.

演算法二

a-zA-Z0-9 這64位取6位組合,可產生500多億個組合數量.把數字和字元組合做一定的映射,就可以產生唯一的字元串,如第62個組合就是aaaaa9,第63個組合就是aaaaba,再利用洗牌演算法,把原字元串打亂後保存,那麼對應位置的組合字元串就會是無序的組合。

把長網址存入資料庫,取返回的id,找出對應的字元串,例如返回ID為1,那麼對應上面的字元串組合就是bbb,同理 ID為2時,字元串組合為bba,依次類推,直至到達64種組合後才會出現重複的可能,所以如果用上面的62個字元,任意取6個字元組合成字元串的話,你的數據存量達到500多億後才會出現重複的可能。

具體參看這裡徹底完善新浪微博介面和超短URL演算法,演算法四可以算作是此演算法的一種實現,此演算法一般不會重複,但是如果是統計的話,就有很大問題,特別是對域名相關的統計,就抓瞎了。

----------------------------------- 程序員分割線-----------------------------------------

JAVA 實現:

public class ShortUrlGenerator {
/**
* @param args
*/
public static void main(String[] args) {
String sLongUrl = "QQ空間"; //長鏈接
String[] aResult = shortUrl(sLongUrl);
// 列印出結果
for (int i = 0; i &< aResult.length; i++) { System.out.println("[" + i + "]:::" + aResult[i]); } } public static String[] shortUrl(String url) { // 可以自定義生成 MD5 加密字元傳前的混合 KEY String key = "mengdelong"; // 要使用生成 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 sMD5EncryptResult = (new Encrypt()).md5(key + url); String hex = sMD5EncryptResu< String[] resUrl = new String[4]; for (int i = 0; i &< 4; i++) { // 把加密字元按照 8 位一組 16 進位與 0x3FFFFFFF 進行位與運算 String sTempSubString = hex.substring(i * 8, i * 8 + 8); // 這裡需要使用 long 型來轉換,因為 Inteper .parseInt() 只能處理 31 位 , 首位為符號位 , 如果不用 long ,則會越界 long lHexLong = 0x3FFFFFFF Long.parseLong(sTempSubString, 16); String outChars = ""; for (int j = 0; j &< 6; j++) { // 把得到的值與 0x0000003D 進行位與運算,取得字元數組 chars 索引 long index = 0x0000003D lHexLong; // 把取得的字元相加 outChars += chars[(int) index]; // 每次循環按位右移 5 位 lHexLong = lHexLong &>&> 5;
}
// 把字元串存入對應索引的輸出數組
resUrl[i] = outChars;
}
return resUrl;
}
}


就是用一個隨機碼對應一個地址,然後在資料庫里查找這個隨機碼,就可以找到對應的網址


假設有6位,從a-zA-Z0-9隨機。

每一位有26+26+10=62種可能,所以總共為62^6=56800235584個不重複網址,完全夠了。

當然,實際中可能要去除I、l、1、0、o、O不易識別的字母,中小網站5位也足夠了56^5=550731776。

PS:短網址的生成演算法還是很有意思的,感興趣可以搜搜。

PSPS:這才發現詳細說明是其他人加上去的,或許已經偏離原來的方向。


構建hash表


Google提供的goo.gl,同一個url每次生成的短地址都不一樣。

新浪http://t.cn,同一個url每次生成的短地址都是一個


真相只有一個:多進位!

先看資料庫設計:

短網址資料庫中,有個對應的網址表,數字ID 和URL對應,數字ID為主鍵,沒有重複。

再看短網址格式:

我們常見的短網址都為一個短域名,後面跟一串字元,這些字元取值範圍是有一定規則的,都是0-9,a-z,A-Z之間的。

多進位的應用:

我們常用的是10進位,單個數字逢10進1,其他常用的進位還有2進位,8進位,16進位,說白了,進位是人為定義的,理論上來說你想要多少進位就有多少進位。

應用到短網址上面,0-9,a-z,A-Z,一共有62個字元,那我們是不是可以弄一個62進位呢?

答案是肯定可以的。想想16進位就能理解,16進位中用A表示我們10進位中的10,B表示11

如果用62進位的話,可以自定義為z(16進位)表示為62(10進位),10(16進位)表示63

通過演算法,把資料庫表中的ID轉化成62進位表示:

例如:ID=865214,那麼對於的62進位為:3d54

前端的服務中,獲取到短網址字元串之後,再通過程序可以反轉成10進位ID,

例如:62進位字元串為RxHTImL,對應的ID為:1587916379269


不會重複,根據資料庫進行編號,一般只包含數字和字母,並且區分大小寫。我就用phurl這個建站程序建了一個網址縮短的網站 985短網址 http://www.985.so 僅供參考


其他都不是問題,問題是就是用過了一段時間能一直存在不,有的不知名的你用著後面可能就跳轉到人家網站,不是你的內容了,那就悲劇了。、

還有後面可能會試行收費。


重複是不會重複的。隨機生成但是也會對比之前的數據。


只要網站不關閉,鏈接就永遠不會失效,更不會面臨枯竭。可以看看我最近做了個短網址生成:http://murl.xyz/


最基本的思路就是將長網址存儲下來,在資料庫做映射表。訪問一個短地址後,通過映射關係跳轉到原來的長網址。

這裡比較出色的一款可以推薦給大家:短鏈接生成器 在線短網址程序 真正有效防止被屏蔽!(第二版)


推薦閱讀:

TAG:網路服務 | 短鏈接 | 短網址 |