突然的短網(wǎng)址生成想法以及網(wǎng)上已有實現(xiàn)

前言

今天突然有一個需求是將文件的下載鏈接發(fā)送到給目標的手機短信宛逗,然后突然想起來自己接到的短信鏈接都是短鏈接帖池,然后就有了以下想法。Ps:都是想法慌申!想法陌选!網(wǎng)上的想法!

思路

如果沒有接觸過短網(wǎng)址理郑,不妨去 http://www.sina.lt/ 和 [https://dwz.cn/(https://dwz.cn/) 稍微體驗下或衡。體驗的結(jié)果是掉奄,短網(wǎng)址都把網(wǎng)址壓縮成了六個字符怎诫,這是巧合嗎惠险?

短網(wǎng)址整個運轉(zhuǎn)邏輯非常簡單,我們以 https://goo.gl/SfzlA2 為例抄腔,當我們訪問這個網(wǎng)址的時候蜀撑,后端可以獲取 "SfzlA2" 這個字符串村怪,然后跳轉(zhuǎn)到 https://github.com/hanzichi法瑟,很顯然冀膝,這個字符串和這個地址已經(jīng)綁定,通過某種映射關(guān)系可以從 "SfzlA2" 獲取完整的地址霎挟。

那么窝剖,看起來我們只需要找到一個算法,能夠?qū)⒁粋€長字符串壓縮成一個短的字符串酥夭,并且該算法應(yīng)該是可逆的赐纱。但是實現(xiàn)這樣的文本壓縮算法,是非常困難的(不存在熬北?)疙描,如果真有這么一個算法和逆運算,那么基本上現(xiàn)在的壓縮軟件都可以歇菜了蒜埋,而世界上所有的信息(網(wǎng)址長度未知)淫痰,都可以壓縮成固定長度個字符,這可能嗎整份?所以不要幻想使用壓縮算法,而且對于 URL 這種不超過 100 bytes 的字符串籽孙,壓縮算法的壓縮比通常都大于 1烈评。

所以我們應(yīng)該轉(zhuǎn)變思路。目前流行的短網(wǎng)址算法大概有兩種犯建,一種是利用 md5讲冠,將長網(wǎng)址 md5 后,再進行分組壓縮适瓦,因為 md5 實質(zhì)上是一種哈希算法竿开,所以難免出現(xiàn)碰撞,當然玻熙,我們有解決哈希沖突的 N 種方法否彩,但是這只會增加系統(tǒng)的復(fù)雜度,不推薦嗦随。另外一種是將網(wǎng)址和一個 62 進制數(shù)(0-9 & a-Z)對應(yīng)列荔,存入數(shù)據(jù)庫中,需要的時候,通過數(shù)據(jù)庫查詢提取贴浙。

上面都是我粘貼的砂吞,哈哈哈哈哈哈,我的想法就是通過一種縮短的算法崎溃,然后將映射關(guān)系放在數(shù)據(jù)庫啊或者緩存啊之類的蜻直,有一段生效時間,防止有重復(fù)之類的袁串,這個時候的縮短算法就很重要了袭蝗。

原理解析

當我們在瀏覽器里輸入 http://t.cn/ReCqY16

  1. DNS首先解析獲得 http://t.cnIP 地址
  2. DNS 獲得 IP 地址以后(比如:119.75.217.109/),會向這個地址發(fā)送 HTTP GET 請求般婆,查詢短碼 RlB2PdD
  3. http://t.cn 服務(wù)器會通過短碼 ReCqY16 獲取對應(yīng)的長 URL
  4. 請求通過 HTTP 301 轉(zhuǎn)到對應(yīng)的長 URL https://www.baidu.com/ 到腥。

這里有個小的知識點,為什么要用 301 跳轉(zhuǎn)而不是 302 吶蔚袍?

301 是永久重定向乡范,302 是臨時重定向。短地址一經(jīng)生成就不會變化啤咽,所以用 301 是符合 http 語義的晋辆。同時對服務(wù)器壓力也會有一定減少。
但是如果使用了 301宇整,我們就無法統(tǒng)計到短地址被點擊的次數(shù)了瓶佳。而這個點擊次數(shù)是一個非常有意思的大數(shù)據(jù)分析數(shù)據(jù)源。能夠分析出的東西非常非常多鳞青。所以選擇302雖然會增加服務(wù)器壓力霸饲,但是我想是一個更好的選擇。

來自知乎 iammutex 的答案

算法實現(xiàn)

網(wǎng)上比較流行的算法有兩種 自增序列算法臂拓、 摘要算法

算法一

自增序列算法 也叫永不重復(fù)算法

設(shè)置 id 自增厚脉,一個 10進制 id 對應(yīng)一個 62進制的數(shù)值,1對1胶惰,也就不會出現(xiàn)重復(fù)的情況傻工。這個利用的就是低進制轉(zhuǎn)化為高進制時,字符數(shù)會減少的特性孵滞。

短址的長度一般設(shè)為 6 位中捆,而每一位是由 [a - z, A - Z, 0 - 9] 總共 62 個字母組成的,所以 6 位的話坊饶,總共會有 62^6 ~= 568億種組合泄伪,基本上夠用了。

哈哈幼东,這里附上一個進制轉(zhuǎn)換工具 http://tool.lu/hexconvert/ 上圖的數(shù)據(jù)就是用這個工具生成的臂容。

具體的算法實現(xiàn)科雳,自行谷歌。

算法二

  1. 將長網(wǎng)址 md5 生成 32 位簽名串,分為 4 段, 每段 8 個字節(jié)
  2. 對這四段循環(huán)處理, 取 8 個字節(jié), 將他看成 16 進制串與 0x3fffffff(30位1) 與操作, 即超過 30 位的忽略處理
  3. 這 30 位分成 6 段, 每 5 位的數(shù)字作為字母表的索引取得特定字符, 依次進行獲得 6 位字符串
  4. 總的 md5 串可以獲得 4 個 6 位串,取里面的任意一個就可作為這個長 url 的短 url 地址

這種算法,雖然會生成4個,但是仍然存在重復(fù)幾率

其他

這樣的實現(xiàn)脓杉,還有一些其他的問題糟秘,比如短網(wǎng)址的長度并不是固定的,這點容易解決球散,補位即可尿赚。再比如,這些短網(wǎng)址蕉堰,按照順序排列凌净,并不顯得隨機,這也好辦屋讶,比如可以隨機生成六位字符串當作 key冰寻,而不是用整數(shù)的遞增,這樣的話皿渗,短網(wǎng)址數(shù)量也不受限了(可以增加短網(wǎng)址位數(shù))斩芭。還有一點,相同的 URL 可能得到不同的短網(wǎng)址乐疆,這點可以另外加個哈匣裕或者用 Set 去解決,還可以加個緩存來解決(在緩存時間內(nèi)挤土,重定向到相同地址琴庵,一旦緩存失效,重新分配 key)仰美。

除了算法設(shè)計外迷殿,真正的系統(tǒng)還需要考慮很多,比如發(fā)號器的設(shè)計筒占,比如緩存(掛個 Redis)贪庙,比如跳轉(zhuǎn),等等翰苫,本文只是我自己瞎想的,也沒實現(xiàn)这橙,都是一些想法奏窑。

短網(wǎng)址系統(tǒng)的設(shè)計,其實依賴的并不是文本壓縮算法屈扎。有些時候埃唯,需要換個角度思考問題

參考

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末墨叛,一起剝皮案震驚了整個濱河市止毕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌漠趁,老刑警劉巖扁凛,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異闯传,居然都是意外死亡谨朝,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門甥绿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來字币,“玉大人,你說我怎么就攤上這事共缕∠闯觯” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵图谷,是天一觀的道長翩活。 經(jīng)常有香客問我,道長蜓萄,這世上最難降的妖魔是什么隅茎? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮嫉沽,結(jié)果婚禮上辟犀,老公的妹妹穿的比我還像新娘。我一直安慰自己绸硕,他們只是感情好堂竟,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著玻佩,像睡著了一般出嘹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上咬崔,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天税稼,我揣著相機與錄音,去河邊找鬼垮斯。 笑死郎仆,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的兜蠕。 我是一名探鬼主播扰肌,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼熊杨!你這毒婦竟也來了曙旭?” 一聲冷哼從身側(cè)響起盗舰,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎桂躏,沒想到半個月后钻趋,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡沼头,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年爷绘,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片进倍。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡土至,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出猾昆,到底是詐尸還是另有隱情陶因,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布垂蜗,位于F島的核電站楷扬,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏贴见。R本人自食惡果不足惜烘苹,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望片部。 院中可真熱鬧镣衡,春花似錦、人聲如沸档悠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽辖所。三九已至惰说,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間缘回,已是汗流浹背吆视。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留酥宴,地道東北人揩环。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像幅虑,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子顾犹,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容