大家好!
這是我的 tnfy.link 系列的第二部分 - 深入研究另一個 URL 縮短器! 這篇文章重點討論短連結生成的複雜性。 雖然看似簡單,但選擇最佳方法卻面臨獨特的挑戰。
本質上,產生短連結涉及為每個長 URL 創建一個簡潔、唯一的識別碼。此 ID 必須滿足幾個條件:
經過徹底調查,我確定了四種建立短連結的主要方法。讓我們詳細研究一下它們。
最直接的方法是利用隨機位元組產生和後續編碼。然而,區分偽隨機和加密安全隨機數產生至關重要。
Go 的 math/rand
套件提供了偽隨機數產生器(PRNG)。 使用相同的種子(初始值)始終會產生相同的數字序列。 雖然足以滿足許多應用程式的需要,但它不適合安全或不可預測的連結生成。
為了增強安全性,crypto/rand
包是更好的選擇。它利用系統噪音來產生真正隨機且不可預測的值 - 想想電磁噪音。 這保證了高熵,但依賴主機獲取隨機資料的虛擬機器在重負載下可能會遇到生成速度較慢的情況。
原始隨機位元組不適合 URL;編碼是必要的。常見的編碼技術包括:
對於用戶友好的短鏈接,Base58 提供了緊湊性和抗錯誤性的最佳平衡。
重點:
雜湊根據輸入產生固定長度的值(例如長 URL)。 雖然保證一致性(相同的輸入總是產生相同的輸出),但它缺乏隨機性。 因此,重複縮短相同的 URL 會產生相同的 ID,因此無法滿足不可預測性要求。
在散列之前添加隨機鹽會引入可變性,但使用原始隨機位元組變得更簡單、更有效率。
通用唯一識別碼(UUID)廣泛用於唯一值產生。 它們的預設格式對於短連結來說太長,但重新編碼(例如,在 Base58 中)可以減小大小。
NanoID 是一種替代方案,它使用可自訂的字母表產生較短的字串(預設為 21 個字元),從而優化了可讀性和抗錯性。
為什麼要避免 UUID?
UUID 從根本上依賴隨機字節,與直接產生隨機值相比沒有顯著優勢。
隨機值產生有時會導致重複,特別是在高負載或 ID 較短的情況下。 雖然 tnfy.link 並非專為高負載場景而設計,但潛在問題值得考慮。
順序計數器本質上保證了唯一性。 Redis使用INCR指令可以實現分散式計數器的實作。 然而,順序 ID 是可以預測的。將序列與隨機位元組結合可以解決這個問題,確保唯一性和不可預測性。
例如:
注意:順序組件可能會顯示產生的連結總數,這在某些情況下可能是不受歡迎的。
這篇文章探討了各種短連結產生方法:
對於大多數應用程序,Base58 編碼的隨機位元組 就足夠了。 對於高負載衝突處理,將隨機位元組與順序組件組合起來是穩健的。 雖然尚未在 tnfy.link 的後端實現,但計劃作為未來的可選功能。
感謝您的閱讀! 歡迎您在評論中提供有關連結生成的回饋!
相關貼文
有關我的項目的更多信息,請參閱我關於 Android 短信網關的文章。
以上是tnfy.link - ID 怎麼樣?的詳細內容。更多資訊請關注PHP中文網其他相關文章!