Sqids: 簡短唯一 ID 生成器
Sqids(發音爲squids
, 魷魚)是一個開源庫,允許您從數字中生成簡短的唯一且看起來隨機的標識符, 而且這些 ID 是 URL 安全的,你可以同時編碼幾個數字, 也可以剔除常見的髒話或者政治敏感的單詞。你可以把它想象成一個十進制到十六進制的轉換器,但它還具備一些額外的功能。 比如:https://example.com/Lqj8a0
先前它叫做Hashids
, 但是由於商標問題,我不得不更改名稱。Sqids 是Short Quick Unique Identifiers
的縮寫。
爲什麼需要簡短的唯一 ID
適合場景
-
短鏈接縮
-
爲日誌生成唯一的事件 ID
-
爲網站上的產品 / 對象生成 ID(如 YouTube 爲視頻所做的那樣)
-
爲文本消息生成短 ID
-
電子郵件中的確認碼
-
商品優惠碼
-
起止時間戳合併縮寫
-
地理位置編碼
-
臨時的 token
不適合場景
-
任何敏感數據
-
生成的 ID 不是哈希值,可以解碼回數字。例如,它們可能不是用戶 ID 的好選擇,因爲一旦解碼,它們可能會泄露你的應用程序的用戶數量
Sqids 的特性
🆔 從非負數字生成短 ID ✅ 易於編碼和解碼 🫣 自動生成的 ID 不包含常見的禁用詞 🎲 支持通過打亂字母順序來自定義 ID 🥳 44 個語言庫, 比如 Go、Rust、C、C++、Bash、Java、Python、JavaScript 等 📌 每個版本都生成相同的 ID 🍻 帶有寬鬆許可的小型庫 (MIT 許可)
Sqids 你可以可以自定義字母表。更長的字母表產生的 ID 更短,更短的字母表產生的 ID 更長。默認字母表包含大寫和小寫字母,因此默認 ID 是區分大小寫的。
使用同樣的輸入和相同的字母表,生成的 ID 是唯一的。
Sqids 可以將一個或多個非負數編碼爲單個 ID。您可以編碼的數字數量沒有限制,但可以編碼的數字大小有限(取決於實現語言)。 比如您可以編碼開始時間和結束時間的 UNIX 時間戳爲一個 ID,或者您可以將數據庫分片號與主鍵一起編碼,並節省額外的數據庫查詢。
Sqids 有什麼限制
-
Sqids 不能編碼負數。
-
最小字母表長度是 3 個字符。
-
字母表中不能包含任何多字節字符。
-
Sqids 不能生成固定長度的 ID,只能生成至少達到某個長度的 ID。最小長度參數範圍在 0 到 255 之間。
-
Sqids 可以嘗試重新生成長度最多爲字母表長度減一的 ID。
屏蔽列表
屏蔽列表可以防止某些單詞出現在您的 ID 中。這是有益的,因爲生成的 ID 可能會出現在公共場所,如 URL 中。
Sqids 附帶了一個默認屏蔽列表,其中包含了幾種語言中最基本的不雅和不當詞彙。當然,您也可以用自己的詞彙來擴展這個屏蔽列表。
屏蔽列表中的單詞匹配是不區分大小寫的。
少於 3 個字符的短單詞不會被屏蔽。長度爲 3 個字符的單詞必須與 ID 完全匹配。如果 4 個或更多字符的單詞是 ID 的子字符串,則會觸發匹配。
如果屏蔽列表中的單詞包含數字(leet 術語),則只有當它們位於 ID 的開頭或結尾時纔會觸發匹配。
ID 是否合法
解碼 ID 通常會產生某種數值輸出,但這並不一定意味着該 ID 是規範的。爲了檢查 ID 是否有效,您可以重新編碼解碼後的數字,並檢查 ID 是否匹配。
不自動執行此操作的原因是,如果將來默認屏蔽列表發生更改,我們不希望自動使過去生成的、現在可能與新屏蔽列表單詞匹配的 ID 失效。
Go 示例
官方提供了一個 Go 語言的庫:sqids/sqids-go[1]。
以下是一個簡單的示例:
package main
import (
"fmt"
"time"
"github.com/sqids/sqids-go"
)
func main() {
s, _ := sqids.New()
id, _ := s.Encode([]uint64{1234567890}) // "PcHfYmv"
fmt.Println(id)
start := time.Now().Unix()
end := time.Now().Add(24 * time.Hour).Unix()
id, _ = s.Encode([]uint64{uint64(start), uint64(end)}) // "s6eUn008oGU27p"
fmt.Println(id)
numbers := s.Decode(id) // [1714879533 1714965933]
fmt.Println(numbers)
}
New
函數還提供額外的參數,用來定製字母表、最小長度和黑名單:
type Options struct {
Alphabet string
MinLength uint8
Blocklist []string
}
比如:
s, _ := sqids.New(sqids.Options{
Alphabet: "FxnXM1kBN6cuhsAvjW3Co7l2RePyY8DwaU04Tzt9fHQrqSVKdpimLGIJOgb5ZE",
})
id, _ := s.Encode([]uint64{1, 2, 3}) // "B4aajs"
numbers := s.Decode(id) // [1, 2, 3]
參考資料
[1]
sqids/sqids-go: https://github.com/sqids/sqids-go
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/_hsnEeyz7uV8oX2IBQW4jw