Sqids: 簡短唯一 ID 生成器

Sqids(發音爲squids, 魷魚)是一個開源庫,允許您從數字中生成簡短的唯一且看起來隨機的標識符, 而且這些 ID 是 URL 安全的,你可以同時編碼幾個數字, 也可以剔除常見的髒話或者政治敏感的單詞。你可以把它想象成一個十進制到十六進制的轉換器,但它還具備一些額外的功能。 比如:https://example.com/Lqj8a0

先前它叫做Hashids, 但是由於商標問題,我不得不更改名稱。Sqids 是Short Quick Unique Identifiers的縮寫。

爲什麼需要簡短的唯一 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 有什麼限制

屏蔽列表

屏蔽列表可以防止某些單詞出現在您的 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