首頁 > 後端開發 > Golang > tnfy.link - ID 怎麼樣?

tnfy.link - ID 怎麼樣?

Patricia Arquette
發布: 2025-01-14 10:48:43
原創
447 人瀏覽過

tnfy.link - What

大家好!

這是我的 tnfy.link 系列的第二部分 - 深入研究另一個 URL 縮短器! 這篇文章重點討論短連結生成的複雜性。 雖然看似簡單,但選擇最佳方法卻面臨獨特的挑戰。

本質上,產生短連結涉及為每個長 URL 創建一個簡潔、唯一的識別碼。此 ID 必須滿足幾個條件:

  • 獨特性:避免衝突。
  • 簡潔:實用。
  • 易於打字:最大限度地減少錯誤。
  • 不可預測性:防止猜測。

經過徹底調查,我確定了四種建立短連結的主要方法。讓我們詳細研究一下它們。


1.隨機位元組方法

最直接的方法是利用隨機位元組產生和後續編碼。然而,區分偽隨機和加密安全隨機數產生至關重要。

偽隨機數

Go 的 math/rand 套件提供了偽隨機數產生器(PRNG)。 使用相同的種子(初始值)始終會產生相同的數字序列。 雖然足以滿足許多應用程式的需要,但它不適合安全或不可預測的連結生成。

加密安全隨機數

為了增強安全性,crypto/rand 包是更好的選擇。它利用系統噪音來產生真正隨機且不可預測的值 - 想想電磁噪音。 這保證了高熵,但依賴主機獲取隨機資料的虛擬機器在重負載下可能會遇到生成速度較慢的情況。

編碼隨機位元組

原始隨機位元組不適合 URL;編碼是必要的。常見的編碼技術包括:

  1. 整數: 將位元組轉換為整數。 易於輸入,但可能會導致 ID 更長。
  2. HEX: 十六進位編碼(0-9、A-F)。不區分大小寫且容錯。
  3. Base64: 採用 A-Z、a-z、0-9、、/ 和 =。 然而,它區分大小寫並且容易出錯。
  4. Base58: 與 Base64 類似,但省略了令人困惑的字元(例如 I、l、O、0)。這提高了用戶友善性。 比特幣、Ripple 和 Flickr 使用 Base58。

對於用戶友好的短鏈接,Base58 提供了緊湊性和抗錯誤性的最佳平衡。

重點:

  • 隨機位元組本質上是唯一且不可預測的。
  • Base58 等編碼增強了可用性。
  • 加密安全的隨機性確保可靠性。

2.哈希方法

雜湊根據輸入產生固定長度的值(例如長 URL)。 雖然保證一致性(相同的輸入總是產生相同的輸出),但它缺乏隨機性。 因此,重複縮短相同的 URL 會產生相同的 ID,因此無法滿足不可預測性要求。

在散列之前添加隨機鹽會引入可變性,但使用原始隨機位元組變得更簡單、更有效率。


3. UUID 方法

通用唯一識別碼(UUID)廣泛用於唯一值產生。 它們的預設格式對於短連結來說太長,但重新編碼(例如,在 Base58 中)可以減小大小。

NanoID 是一種替代方案,它使用可自訂的字母表產生較短的字串(預設為 21 個字元),從而優化了可讀性和抗錯性。

為什麼要避免 UUID?

UUID 從根本上依賴隨機字節,與直接產生隨機值相比沒有顯著優勢。


4.順序方法

隨機值產生有時會導致重複,特別是在高負載或 ID 較短的情況下。 雖然 tnfy.link 並非專為高負載場景而設計,但潛在問題值得考慮。

順序計數器本質上保證了唯一性。 Redis使用INCR指令可以實現分散式計數器的實作。 然而,順序 ID 是可以預測的。將序列與隨機位元組結合可以解決這個問題,確保唯一性和不可預測性。

例如:

  • 隨機值遞增序列:如果兩個實例產生相同的隨機值,則序列確保唯一性。

注意:順序組件可能會顯示產生的連結總數,這在某些情況下可能是不受歡迎的。


結論

這篇文章探討了各種短連結產生方法:

  • 隨機位元組:簡單有效,特別是使用 Base58 等安全編碼。
  • 雜湊: 可靠,但此應用程式缺乏隨機性。
  • UUID/NanoID: 不錯的替代方案,但與原始隨機位元組相比增加了不必要的複雜性。
  • 序列:解決衝突但增加 ID 長度。

對於大多數應用程序,Base58 編碼的隨機位元組 就足夠了。 對於高負載衝突處理,將隨機位元組與順序組件組合起來是穩健的。 雖然尚未在 tnfy.link 的後端實現,但計劃作為未來的可選功能。

感謝您的閱讀! 歡迎您在評論中提供有關連結生成的回饋!


相關貼文

有關我的項目的更多信息,請參閱我關於 Android 短信網關的文章。

以上是tnfy.link - ID 怎麼樣?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板