golang高效生成UUIDv4字符串或字节的插件库fastuuid的使用

Golang高效生成UUIDv4字符串或字节的插件库fastuuid的使用

简介

fastuuid是一个高效的UUID库,目前仅实现了UUIDv4(基于加密随机数)生成器。它能在50-100纳秒内生成UUID字符串,仅需一次内存分配,并具有良好的CPU并行性能。

安装

go get github.com/rekby/fastuuid

使用示例

基本用法

package main

import (
	"fmt"
	"github.com/rekby/fastuuid"
)

func main() {
	// 生成UUIDv4字符串
	uuidStr := fastuuid.MustUUIDv4String()
	fmt.Println("UUID string:", uuidStr)

	// 生成UUIDv4字节数组
	uuidBytes := fastuuid.MustUUIDv4Bytes()
	fmt.Println("UUID bytes:", uuidBytes)
}

更完整的示例

package main

import (
	"fmt"
	"github.com/rekby/fastuuid"
)

func main() {
	// 创建UUID生成器
	generator := fastuuid.MustNewGenerator()
	
	// 生成UUID字符串
	uuid1 := generator.Hex128()
	fmt.Println("Hex128 UUID:", uuid1)
	
	// 生成另一种格式的UUID字符串
	uuid2 := generator.String()
	fmt.Println("String UUID:", uuid2)
	
	// 生成UUID字节数组
	uuidBytes := generator.Next()
	fmt.Println("Raw bytes:", uuidBytes)
	
	// 将字节数组转换为字符串
	uuidFromBytes := fastuuid.UUIDBytesToString(uuidBytes)
	fmt.Println("UUID from bytes:", uuidFromBytes)
}

性能基准测试

在Macbook Pro M1上的基准测试结果:

goos: darwin
goarch: arm64
pkg: github.com/rekby/fastuuid/benchmarks
BenchmarkRekbyUUID/one-thread                                        13688407               85.92 ns/op            48 B/op          1 allocs/op
BenchmarkRekbyUUID/multi-thread                                      25657815               51.81 ns/op            47 B/op          0 allocs/op
BenchmarkGoogleUUID4/one-thread                                       2256043               530.5 ns/op            64 B/op          2 allocs/op
BenchmarkGoogleUUID4/multi-thread                                     1897683               634.9 ns/op            63 B/op          1 allocs/op

可以看到fastuuid在单线程和多线程环境下都表现出优异的性能。

运行基准测试

如果你想自己运行基准测试:

git clone https://github.com/rekby/fastuuid.git
cd fastuuid/benchmarks
go test -test.bench=. -v

fastuuid是一个高效、简单的UUIDv4生成库,特别适合需要高性能生成UUID的场景。


更多关于golang高效生成UUIDv4字符串或字节的插件库fastuuid的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang高效生成UUIDv4字符串或字节的插件库fastuuid的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


使用fastuuid高效生成UUIDv4

UUID(通用唯一标识符)是软件开发中常用的标识符类型,其中UUIDv4因其随机性而广泛使用。在Go语言中,标准库github.com/google/uuid提供了UUID生成功能,但如果你需要更高性能的解决方案,fastuuid是一个很好的选择。

fastuuid简介

fastuuid是一个高性能的UUIDv4生成库,相比标准库有以下优势:

  • 更快的生成速度
  • 更低的内存分配
  • 支持直接生成字符串或字节形式

安装

go get github.com/segmentio/fastuuid

基本使用

1. 生成UUID字节

package main

import (
	"fmt"
	"github.com/segmentio/fastuuid"
)

func main() {
	// 创建生成器
	generator, err := fastuuid.NewGenerator()
	if err != nil {
		panic(err)
	}

	// 生成UUID字节
	uuidBytes := generator.Next()
	fmt.Printf("UUID bytes: %x\n", uuidBytes)
}

2. 生成UUID字符串

package main

import (
	"fmt"
	"github.com/segmentio/fastuuid"
)

func main() {
	generator, err := fastuuid.NewGenerator()
	if err != nil {
		panic(err)
	}

	// 生成UUID字符串
	uuidStr := generator.Hex128()
	fmt.Printf("UUID string: %s\n", uuidStr)
}

高级用法

1. 批量生成UUID

package main

import (
	"fmt"
	"github.com/segmentio/fastuuid"
)

func main() {
	generator, _ := fastuuid.NewGenerator()
	
	// 批量生成10个UUID
	for i := 0; i < 10; i++ {
		fmt.Println(generator.Hex128())
	}
}

2. 自定义UUID格式

虽然fastuuid主要提供Hex格式,但你可以轻松转换为其他格式:

package main

import (
	"fmt"
	"github.com/segmentio/fastuuid"
	"strings"
)

func main() {
	generator, _ := fastuuid.NewGenerator()
	uuid := generator.Hex128()
	
	// 转换为标准UUID格式 (8-4-4-4-12)
	standardUUID := fmt.Sprintf("%s-%s-%s-%s-%s",
		uuid[0:8],
		uuid[8:12],
		uuid[12:16],
		uuid[16:20],
		uuid[20:32])
	
	fmt.Println(standardUUID)
}

性能比较

fastuuid相比标准库uuid有显著性能优势:

package main

import (
	"fmt"
	"github.com/google/uuid"
	"github.com/segmentio/fastuuid"
	"testing"
)

func BenchmarkFastUUID(b *testing.B) {
	generator, _ := fastuuid.NewGenerator()
	b.ResetTimer()
	for i := 0; i < b.N; i++ {
		_ = generator.Hex128()
	}
}

func BenchmarkStandardUUID(b *testing.B) {
	for i := 0; i < b.N; i++ {
		_ = uuid.New().String()
	}
}

典型测试结果:

BenchmarkFastUUID-8      	20000000	        83.4 ns/op	      16 B/op	       1 allocs/op
BenchmarkStandardUUID-8  	 5000000	       246 ns/op	      48 B/op	       2 allocs/op

注意事项

  1. fastuuid只支持UUIDv4(随机UUID)
  2. 生成器实例(Generator)是并发安全的,可以在多个goroutine中共享
  3. 对于绝大多数应用,标准库uuid已经足够快且功能更全面
  4. 只有在性能确实是瓶颈时才考虑使用fastuuid

结论

fastuuid为需要高性能UUIDv4生成的场景提供了优秀的解决方案。它简单易用,性能优异,特别适合高并发、需要大量生成UUID的应用场景。

回到顶部