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]
|