短鏈接系統可以把比較長的 URL 網址轉換成簡短的網址字符串,短鏈接的優勢是方便傳播。適合在一些對字符串長度有要求的場景中使用,比如短信,微博等,比如
https://www.cnblogs.com/myshowtime/p/16227260.html
轉換成短鏈接爲
設計要求
根據面試的要求,你需要設計一個短鏈接系統, 鏈接的長度儘量比較短,每天生成 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名校卡內基梅隆大學,熱衷於系統設計。