【系統設計】設計一個短鏈接系統

短鏈接系統可以把比較長的 URL 網址轉換成簡短的網址字符串,短鏈接的優勢是方便傳播。適合在一些對字符串長度有要求的場景中使用,比如短信,微博等,比如

https://www.cnblogs.com/myshowtime/p/16227260.html

轉換成短鏈接爲

https://bit.ly/3z0QtB9

設計要求

根據面試的要求,你需要設計一個短鏈接系統, 鏈接的長度儘量比較短,每天生成 1 億個URL,服務要運行 10 年。

首先,我們看一下短鏈接的工作原理。

工作原理

在 Chrome 上輸入短鏈接,會發生什麼?

打開開發者工具, 可以看到, 服務器收到請求後,會把短鏈接轉換成長鏈接,然後返回瀏覽器,進行 301 重定向,請求到長鏈接地址。

另外一個問題,如何把長鏈接轉換成短鏈接?

能否使用一些加密算法呢?明顯是行不通的,因爲字符串加密後會變的更長。

哈希算法

實際上,我們可以使用哈希算法和哈希表實現,如下

長鏈接經過哈希算法後, 會生成固定長度的哈希值 key,也就是短鏈接的值,並保存到哈希表中。

使用短鏈接查詢長鏈接時,只需要查詢哈希表即可。

上面是常見的哈希算法,最少也要8位。

那我們需要多少位的短鏈接呢?根據上面的要求,一天生成一個億的短鏈接,運行10年,1億 * 365 * 10 = 3650 億。

短鏈接的字符在 [0-9,a-z,A-Z] 之間,總共 62 個不同的字符,可以計算出下面的數據。

可以看出,要滿足系統要求的話,短鏈接的長度最少爲 7 位。在實際中,很多短鏈接系統的長度也是 7 位。有興趣的同學還可以看一下,米勒定律 7±2 法則。

上面的 CRC32 算法,最少也是 8 位。不過我們可以截取前 7 位,最後一位丟棄。但是這樣可能會出現哈希衝突的問題,我們可以給長鏈接遞歸地拼接一個值,直到不再發現衝突,當然也可以用其他的哈希衝突解決方法。

Base 62 轉換

這是另外一種常見的方法,Base 62 字符由大寫字母 A-Z、小寫字母 a-z 和數字 0-9 組成, 總共 62 位,如下

base 62 和 base 64 相比,只不過少了2個字符 + 和 /,大家可以想一下,這裏我們爲什麼不用 base 64。

Base 62 和上面的哈希算法的思路是不一樣的,哈希算法是根據長鏈接計算哈希值,然後保存到哈希表中。而 base 62 需要給每條長鏈接生成一個唯一的數字 ID,如下

那麼如何計算短鏈接 ShortURL 呢? 因爲 Id 是唯一的 10 進制數字,我們只需要把它轉成 62 進制即可, 這裏和從2進制轉換到10進制是一樣的。

假如有一個 ID 爲 11157, 轉換的過程如下

最終得到的短鏈接的值爲 https://xxx.com/2TX。

總結

在本文中,介紹了兩種實現短鏈接的方法,分別是哈希算法和 base 62。

哈希算法的特點是,固定的短鏈接長度,不需要生成唯一ID,可能會出現哈希衝突。

base 62 轉換的特點是,長度不固定,取決於 ID 的大小,1000 轉換後是 G8, 1000 億 轉換後是 1l9Zo9o。另外還需要生成唯一數字 ID,沒有哈希衝突的問題。

希望對您有用!

譯:等天黑

作者:Alex Xu

來源:《System Design Interview》

簡介: Alex Xu 是一位經驗豐富的軟件工程師, 曾在 Twitter, Apple 和 Oracle 任職,來自CS名校卡內基梅隆大學,熱衷於系統設計。

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