golang实现UUID生成与解析的插件库uuid的使用
Golang实现UUID生成与解析的插件库uuid的使用
概述
uuid包提供了纯Go实现的通用唯一标识符(UUID),符合RFC-9562标准。该包支持创建和解析不同格式的UUID。
支持的UUID版本包括:
- 版本1:基于时间戳和MAC地址
- 版本3:基于命名值的MD5哈希
- 版本4:基于随机数
- 版本5:基于命名值的SHA-1哈希
- 版本6:基于时间戳的可排序ID,与v1字段兼容
- 版本7:基于时间戳的可排序ID
安装
go get github.com/gofrs/uuid/v5
使用示例
package main
import (
"log"
"github.com/gofrs/uuid/v5"
)
// 创建一个版本4的UUID,出错时panic
// 这种形式用于初始化包级变量
var u1 = uuid.Must(uuid.NewV4())
func main() {
// 创建一个版本4的UUID
u2, err := uuid.NewV4()
if err != nil {
log.Fatalf("生成UUID失败: %v", err)
}
log.Printf("生成的版本4 UUID: %v", u2)
// 从字符串解析UUID
s := "6ba7b810-9dad-11d1-80b4-00c04fd430c8"
u3, err := uuid.FromString(s)
if err != nil {
log.Fatalf("解析UUID %q 失败: %v", s, err)
}
log.Printf("成功解析UUID: %v", u3)
}
其他版本UUID生成示例
package main
import (
"log"
"github.com/gofrs/uuid/v5"
)
func main() {
// 生成版本1 UUID (基于时间戳和MAC地址)
u1, err := uuid.NewV1()
if err != nil {
log.Fatalf("生成版本1 UUID失败: %v", err)
}
log.Printf("版本1 UUID: %v", u1)
// 生成版本3 UUID (基于命名空间的MD5哈希)
namespace := uuid.Must(uuid.FromString("6ba7b810-9dad-11d1-80b4-00c04fd430c8"))
u3 := uuid.NewV3(namespace, []byte("example"))
log.Printf("版本3 UUID: %v", u3)
// 生成版本5 UUID (基于命名空间的SHA-1哈希)
u5 := uuid.NewV5(namespace, []byte("example"))
log.Printf("版本5 UUID: %v", u5)
}
项目历史
该项目最初是从github.com/satori/go.uuid仓库fork而来,原因是原项目似乎不再维护,并且存在一些关键缺陷。我们决定接管这个项目以确保它能得到定期维护,造福更大的Go社区。
许可证
该包的源代码发布在MIT许可证下。
要求
该包需要Go 1.19或更高版本
推荐版本
我们推荐使用该包的v2.0.0+版本,因为2.0.0之前的版本是在我们fork原始包之前创建的,存在一些已知的缺陷。
更多关于golang实现UUID生成与解析的插件库uuid的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang实现UUID生成与解析的插件库uuid的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Golang UUID 生成与解析:使用 github.com/google/uuid 库
UUID (Universally Unique Identifier) 是一种广泛使用的标识符格式,在分布式系统中特别有用。在Go语言中,github.com/google/uuid
是最常用的UUID库之一。
安装
首先安装该库:
go get github.com/google/uuid
基本使用
1. 生成UUID
package main
import (
"fmt"
"github.com/google/uuid"
)
func main() {
// 生成版本4的随机UUID (最常用)
id := uuid.New()
fmt.Println("Generated UUID:", id)
// 生成版本1的基于时间和MAC地址的UUID
idV1, err := uuid.NewUUID()
if err != nil {
fmt.Println("Error generating UUID v1:", err)
return
}
fmt.Println("UUID v1:", idV1)
// 生成版本4的UUID (另一种方式)
idV4 := uuid.NewString() // 直接返回字符串形式
fmt.Println("UUID v4 as string:", idV4)
}
2. 解析UUID字符串
func parseUUID() {
// 有效的UUID字符串
uuidStr := "6ba7b810-9dad-11d1-80b4-00c04fd430c8"
// 解析UUID
parsedUUID, err := uuid.Parse(uuidStr)
if err != nil {
fmt.Println("Error parsing UUID:", err)
return
}
fmt.Println("Parsed UUID:", parsedUUID)
fmt.Println("UUID version:", parsedUUID.Version())
fmt.Println("UUID variant:", parsedUUID.Variant())
}
3. UUID比较与操作
func uuidOperations() {
// 创建两个UUID
uuid1 := uuid.New()
uuid2 := uuid.New()
// 比较UUID
if uuid1 == uuid2 {
fmt.Println("UUIDs are equal (very unlikely!)")
} else {
fmt.Println("UUIDs are different (expected)")
}
// 获取UUID的字节数组
bytes := uuid1[:]
fmt.Printf("UUID as bytes: %v\n", bytes)
// 从字节数组创建UUID
uuidFromBytes, err := uuid.FromBytes(bytes)
if err != nil {
fmt.Println("Error creating UUID from bytes:", err)
return
}
fmt.Println("UUID from bytes:", uuidFromBytes)
}
4. 自定义UUID生成
func customUUID() {
// 使用自定义字节创建UUID (16字节)
customBytes := [16]byte{
0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,
}
customUUID := uuid.Must(uuid.FromBytes(customBytes[:]))
fmt.Println("Custom UUID:", customUUID)
// 检查UUID是否为零值
zeroUUID := uuid.Nil
if zeroUUID == uuid.Nil {
fmt.Println("This is the nil UUID")
}
}
高级用法
1. 批量生成UUID
func batchGenerate(count int) []uuid.UUID {
uuids := make([]uuid.UUID, count)
for i := 0; i < count; i++ {
uuids[i] = uuid.New()
}
return uuids
}
2. 数据库中使用UUID
func databaseExample() {
// 假设使用数据库时
id := uuid.New()
// 存储为字符串
idStr := id.String()
fmt.Println("Storable string:", idStr)
// 或者直接使用字节存储
idBytes := id[:]
fmt.Println("Storable bytes:", idBytes)
// 从数据库读取后解析
restoredID, err := uuid.Parse(idStr)
if err != nil {
fmt.Println("Error restoring UUID:", err)
return
}
fmt.Println("Restored UUID:", restoredID)
}
注意事项
github.com/google/uuid
支持 RFC 4122 定义的UUID标准- 版本4 (随机) UUID是最常用的,除非你有特殊需求需要使用其他版本
- 该库线程安全,可以在并发环境中使用
- 解析时如果格式不正确会返回错误
- UUID作为主键时,比自增ID更适合分布式系统
这个库简单易用,基本上能满足大多数Golang项目中UUID相关的需求。对于更高级的用例,你可能需要查看库的源代码或文档以了解更详细的功能。