短地址(ShortUrl)實例

短地址,就是把長的URL轉成短URL, 目前谷歌/新浪/百度/騰訊等都免費提供API服務。因調用次數限制或提供出去的url域名不是想要的,因此考慮自己實現。

短址本質上是實現了一個映射函數 f: X -> Y 。而這個映射函數必須同時具有兩個特點:

1. 如果 x1 != x2, 則 f (x1) != f(x2);

2. 對於每一個 y, 能夠找到唯一的一個 x 使得 f(x) = y;

對於任何的線性函數,比如 f(x) = 2x,都滿足這樣的條件。

實現:

短址的長度可以是任意位數,如6,7,8等,而每一位可以由 [a - z, A - Z, 0 - 9, - _] 總共 64 個字母/數字/符號組成的,所以6位的話,總共會有 64^6 ~= 幾百億種組合,足夠使用。在百度地圖服務中,短址長度爲5,如:http://j.map.baidu.com/fSask

本文的思路通過進制之間的轉換。規則如下:

0  → a

1  → b

...

25 → z

...

52 → 0

61 → 9

62 → -

63 → _

假設我們用數據庫來保存長地址和短地址的映射,那麼,在表 ShortURL 中,我們會有三列:

id, integer, auto-increment  //ID,自動增長

long, string, the long URL the user entered  //長URL

short, string, the shortened URL (or just the six characters)  //短URL

長地址生成短地址:

1. 記錄寫入表 ShortURL ,得到ID

2. 十進制的ID轉換成64進制短串,如果約定6位短串的話,不夠位數則在前面補0,例如ID=123123 對應的短串爲 aaaEdZ

實現如下:

public static final String ALPHABET = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_";

public static final int BASE = ALPHABET.length();

public static String encode(int num) {

StringBuilder str = new StringBuilder();

while (num > 0) {

str.insert(0, ALPHABET.charAt(num % BASE));

num = num / BASE;

}

int len = str.length();

for (int i = 1; i <= 6 - len; i++) {

str.insert(0, ALPHABET.charAt(0));

}

return str.toString();

}

短地址轉長地址:

1. 通過短地址得到ID

2. 通過ID查 ShortURL ,得到長地址

實現如下:

public static int decode(String str) {

int id = 0;

int size = str.length();

for (int i = 0; i < size; i++) {

int value = ALPHABET.indexOf(str.charAt(i));

id += (int) (value * Math.pow(BASE, size - i - 1));

}

return id;

}

實例源碼:test2-shorturl

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章