Sqids: 简短唯一ID生成器

Sqids 是Short Quick Unique Identifiers的缩写。

允许从数字中生成简短的唯一且看起来随机的标识符, 而且这些 ID 是 URL 安全的,可以同时编码几个数字, 也可以剔除常见的脏话或者政治敏感的单词。

适合场景

  • 短链接缩
  • 为日志生成唯一的事件 ID
  • 为网站上的产品/对象生成 ID(如 YouTube 为视频所做的那样)
  • 为文本消息生成短 ID
  • 电子邮件中的确认码
  • 商品优惠码
  • 起止时间戳合并缩写
  • 地理位置编码
  • 临时的 token

不适合场景

  • 任何敏感数据
  • 生成的 ID 不是哈希值,可以解码回数字。例如,它们可能不是用户 ID 的好选择,因为一旦解码,它们可能会泄露你的应用程序的用户数量

Sqids 有什么限制

  • Sqids 不能编码负数。
  • 最小字母表长度是 3 个字符。
  • 字母表中不能包含任何多字节字符。
  • Sqids 不能生成固定长度的 ID,只能生成至少达到某个长度的 ID。最小长度参数范围在 0 到 255 之间。
  • Sqids 可以尝试重新生成长度最多为字母表长度减一的 ID。

Go 示例

Go 语言的库: sqids/sqids-go

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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函数还提供额外的参数,用来定制字母表、最小长度和黑名单:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
type Options struct {
 Alphabet  string
 MinLength uint8
 Blocklist []string
}

// 使用options参数
s, _ := sqids.New(sqids.Options{
  Alphabet: "FxnXM1kBN6cuhsAvjW3Co7l2RePyY8DwaU04Tzt9fHQrqSVKdpimLGIJOgb5ZE",
 })
 id, _ := s.Encode([]uint64{1, 2, 3}) // "B4aajs"
 numbers := s.Decode(id)              // [1, 2, 3]