golang高效生成唯一字符串ID插件库nanoid的使用
Golang高效生成唯一字符串ID插件库nanoid的使用
Nano ID
Nano ID是一个小巧快速的Go语言唯一字符串生成器。
特点
- 安全:使用加密强度高的随机API并测试符号分布
- 紧凑:使用比UUID更大的字母表(A-Za-z0-9_-),将ID大小从36个字符减少到21个字符
安装
安装Go后,运行以下命令获取Nano ID:
go get github.com/aidarkhanov/nanoid/v2
使用示例
package main
import (
"log"
"github.com/aidarkhanov/nanoid/v2"
)
func main() {
// 生成默认长度的随机ID (21个字符)
id, err := nanoid.New() // 示例输出: "i25_rX9zwDdDn7Sg-ZoaH"
if err != nil {
log.Fatalln(err)
}
log.Println("Generated ID:", id)
// 生成自定义长度的ID
customID, err := nanoid.New(10) // 生成10个字符的ID
if err != nil {
log.Fatalln(err)
}
log.Println("Custom length ID:", customID)
// 使用自定义字母表生成ID
const alphabet = "0123456789ABCDEF"
hexID, err := nanoid.Generate(alphabet, 8) // 生成8个字符的十六进制ID
if err != nil {
log.Fatalln(err)
}
log.Println("Hexadecimal ID:", hexID)
}
文档
该包的参考文档位于pkg.go.dev/github.com/aidarkhanov/nanoid/v2。
路线图
- 该包的API已经冻结
- 必要时发布补丁
许可证
本包根据MIT/Expat许可证提供。
致谢
- Andrey Sitnik提供的原始JavaScript算法实现
- Paul Yuan让我改进该库的Python版本
更多关于golang高效生成唯一字符串ID插件库nanoid的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang高效生成唯一字符串ID插件库nanoid的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Golang中使用NanoID生成唯一字符串ID
NanoID是一个小巧、安全、URL友好的唯一字符串ID生成器,是UUID的替代方案。以下是Golang中使用NanoID的详细指南。
安装NanoID
首先安装NanoID库:
go get github.com/jaevor/go-nanoid
基本使用
package main
import (
"fmt"
"github.com/jaevor/go-nanoid"
)
func main() {
// 创建一个默认的NanoID生成器
id, err := nanoid.New()
if err != nil {
panic(err)
}
// 生成ID
generatedID := id()
fmt.Println("Generated ID:", generatedID)
// 输出类似: Generated ID: V1StGXR8_Z5jdHi6B-myT
}
自定义配置
NanoID提供了多种自定义选项:
1. 自定义长度
func main() {
// 生成长度为12的ID
id, err := nanoid.CustomASCII("abcdefghijklmnopqrstuvwxyz", 12)
if err != nil {
panic(err)
}
for i := 0; i < 5; i++ {
fmt.Println(id())
}
}
2. 自定义字符集
func main() {
// 只使用数字
numericID, err := nanoid.CustomASCII("0123456789", 10)
if err != nil {
panic(err)
}
fmt.Println("Numeric ID:", numericID())
// 使用自定义字符集
customID, err := nanoid.CustomASCII("ABCDEFGHJKLMNPQRSTUVWXYZ23456789", 8)
if err != nil {
panic(err)
}
fmt.Println("Custom ID:", customID())
}
3. 预定义的字符集
func main() {
// 使用字母数字字符集(不含符号)
alphanumericID, err := nanoid.CustomASCII(nanoid.Alphanumeric, 10)
if err != nil {
panic(err)
}
fmt.Println("Alphanumeric ID:", alphanumericID())
}
性能考虑
NanoID的性能非常高,以下是简单的性能测试:
package main
import (
"fmt"
"time"
"github.com/jaevor/go-nanoid"
)
func main() {
id, _ := nanoid.New(10)
start := time.Now()
const count = 100000
for i := 0; i < count; i++ {
_ = id()
}
elapsed := time.Since(start)
fmt.Printf("Generated %d IDs in %s\n", count, elapsed)
fmt.Printf("%.0f IDs per second\n", float64(count)/elapsed.Seconds())
}
实际应用示例
在Web应用中生成唯一ID
package main
import (
"fmt"
"net/http"
"github.com/jaevor/go-nanoid"
)
var idGenerator func() string
func init() {
var err error
idGenerator, err = nanoid.New(12)
if err != nil {
panic(err)
}
}
func handler(w http.ResponseWriter, r *http.Request) {
// 为每个请求生成唯一ID
requestID := idGenerator()
fmt.Fprintf(w, "Your request ID: %s", requestID)
}
func main() {
http.HandleFunc("/", handler)
http.ListenAndServe(":8080", nil)
}
数据库记录ID生成
package main
import (
"fmt"
"github.com/jaevor/go-nanoid"
)
type User struct {
ID string
Name string
Email string
}
func main() {
idGenerator, _ := nanoid.New(8)
users := []User{
{ID: idGenerator(), Name: "Alice", Email: "alice@example.com"},
{ID: idGenerator(), Name: "Bob", Email: "bob@example.com"},
{ID: idGenerator(), Name: "Charlie", Email: "charlie@example.com"},
}
for _, user := range users {
fmt.Printf("User ID: %s, Name: %s\n", user.ID, user.Name)
}
}
与UUID比较
NanoID相比UUID有以下几个优势:
- 更短:默认21字符(UUID是36字符)
- URL友好:不使用特殊字符
- 可自定义:可以指定字符集和长度
- 相似碰撞概率:在相同长度下
注意事项
- 默认实现不是加密安全的,如果需要加密安全版本,请使用
nanoid.Standard
函数 - ID长度和字符集会影响碰撞概率,请根据需求选择
- 在分布式系统中,仍需考虑时钟偏移等问题
NanoID是一个简单高效的ID生成解决方案,适用于大多数需要唯一标识符的场景。