經(jīng)常能看到某些站點(diǎn)會使用一些短鏈接,例如:t.cn/RyG7nlE這樣形式的鏈接。
短鏈接有以下好處:
1、短小精悍,方便推廣,記憶(實(shí)際應(yīng)該沒什么人去記憶吧);
2、可收集站點(diǎn)訪問數(shù)據(jù),用作數(shù)據(jù)分析等用途;
3、做了一層中轉(zhuǎn),可以做各種個(gè)性化定制,如設(shè)置鏈接開放日期等訪問控制的邏輯判斷;
4、節(jié)約空間,如微博會有字?jǐn)?shù)限制;
短鏈接一般會有兩種做法:
一、
自增序列算法,也叫永不重復(fù)算法,用到的其實(shí)就是多進(jìn)制,讓一個(gè)整型用多進(jìn)制表示,根據(jù)這個(gè)id查找對應(yīng)的長鏈接。
用數(shù)字100000000為例,以不同進(jìn)制表示:
| 進(jìn)制 | 結(jié)果 | 元素 |
|---|---|---|
| 2 | 101111101011110000100000000 | [0-1] |
| 8 | 575360400 | [0-7] |
| 10 | 100000000 | [0-9] |
| 16 | 0x5f5e100 | [0-9a-f] |
| 26 | ikvozw | [a-z] |
| 36 | 1njchs | [0-9a-z] |
| 52 | nJkmW | [a-zA-Z] |
| 62 | 6LAze | [0-9a-zA-Z] |
62進(jìn)制 [0-9a-zA-Z] 表示10000只需要3個(gè)字符,長度大大縮短。
可以估算一下,
232 < (25.5) 6 < 45.56 < 466 < 626,
264 < (210 * 22/3) 6 < 16266 < 19326 < (62 * 625/6) 6 < 6211
由此可見,32位二進(jìn)制數(shù)字可用6位62進(jìn)制字符表示,64位二進(jìn)制數(shù)字可用11位62進(jìn)制字符表示,264 = 9,223,372,036,854,775,807,就是9百京,這個(gè)數(shù)量就非常足夠了。(原來比不上黃金弗利薩的戰(zhàn)斗力,有一個(gè)垓)
缺點(diǎn):根據(jù)自增id生成,長短可能會不一,這個(gè)也可以通過填充特定字符來解決。
二、
1、將長鏈接md5,獲取32位字符串;
2、32位字符串按分8字節(jié)4份,循環(huán)處理,作為16進(jìn)制數(shù)字和0x3fffffff(30個(gè)1)進(jìn)行位與操作(超過30位忽略);
3、30位分6段,每5位數(shù)字作為一個(gè)索引獲取集合[a-z0-9]中對應(yīng)的字符,最后獲得4個(gè)長度為6的字符串;
4、4個(gè)字符串中任意取一個(gè)作為短鏈接
缺點(diǎn):
1、生成的短鏈接可能會產(chǎn)生碰撞,據(jù)說微博是使用這種算法(上面的文字是我搬運(yùn)過來的,這個(gè)算法我不太懂它設(shè)計(jì)的原理。。。);
2、需要用字符串作為查詢條件去獲取長鏈接,容易數(shù)據(jù)庫索引建立不連續(xù),降低查詢效率;
我使用的是第一種,恰好我們的長鏈接中的信息也都是整型,只要轉(zhuǎn)化一下,再拼湊起來組成短鏈接就可以了,這樣就連數(shù)據(jù)庫hash表都可以不用建立。