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有以下几个优势:

  1. 更短:默认21字符(UUID是36字符)
  2. URL友好:不使用特殊字符
  3. 可自定义:可以指定字符集和长度
  4. 相似碰撞概率:在相同长度下

注意事项

  1. 默认实现不是加密安全的,如果需要加密安全版本,请使用nanoid.Standard函数
  2. ID长度和字符集会影响碰撞概率,请根据需求选择
  3. 在分布式系统中,仍需考虑时钟偏移等问题

NanoID是一个简单高效的ID生成解决方案,适用于大多数需要唯一标识符的场景。

回到顶部