golang基于RFC 4122和DCE 1.1标准的UUID生成与验证插件库uuid的使用
Golang基于RFC 4122和DCE 1.1标准的UUID生成与验证插件库uuid的使用
简介
uuid包基于RFC 9562和DCE 1.1:认证和安全服务标准生成和检查UUID。这个包基于github.com/pborman/uuid包(之前名为code.google.com/p/go-uuid)。与早期包的不同之处在于,UUID是一个16字节数组而不是字节切片。
安装
go get github.com/google/uuid
使用示例
下面是一个完整的示例,展示如何使用uuid包生成和验证UUID:
package main
import (
"fmt"
"github.com/google/uuid"
)
func main() {
// 生成一个新的UUID v4
newUUID := uuid.New()
fmt.Println("Generated UUID v4:", newUUID)
// 从字符串解析UUID
uuidString := "f47ac10b-58cc-0372-8567-0e02b2c3d479"
parsedUUID, err := uuid.Parse(uuidString)
if err != nil {
fmt.Println("Error parsing UUID:", err)
return
}
fmt.Println("Parsed UUID:", parsedUUID)
// 检查UUID版本
switch parsedUUID.Version() {
case uuid.Version1:
fmt.Println("This is a version 1 (time-based) UUID")
case uuid.Version2:
fmt.Println("This is a version 2 (DCE security) UUID")
case uuid.Version3:
fmt.Println("This is a version 3 (MD5 hash) UUID")
case uuid.Version4:
fmt.Println("This is a version 4 (random) UUID")
case uuid.Version5:
fmt.Println("This is a version 5 (SHA-1 hash) UUID")
default:
fmt.Println("Unknown UUID version")
}
// 生成命名UUID (version 3和5)
namespaceDNS := uuid.NameSpaceDNS
name := "example.com"
// Version 3 (MD5)
uuidV3 := uuid.NewMD5(namespaceDNS, []byte(name))
fmt.Println("Version 3 UUID:", uuidV3)
// Version 5 (SHA-1)
uuidV5 := uuid.NewSHA1(namespaceDNS, []byte(name))
fmt.Println("Version 5 UUID:", uuidV5)
// 生成时间序列UUID (version 1)
uuidV1, err := uuid.NewUUID()
if err != nil {
fmt.Println("Error generating version 1 UUID:", err)
return
}
fmt.Println("Version 1 UUID:", uuidV1)
fmt.Println("Version 1 UUID timestamp:", uuidV1.Time())
}
主要功能
-
生成UUID:
uuid.New()
- 生成随机的UUID v4uuid.NewUUID()
- 生成基于时间的UUID v1uuid.NewMD5()
- 生成基于MD5的命名UUID v3uuid.NewSHA1()
- 生成基于SHA-1的命名UUID v5
-
解析和验证UUID:
uuid.Parse()
- 从字符串解析UUIDuuid.ParseBytes()
- 从字节切片解析UUID
-
UUID信息获取:
UUID.Version()
- 获取UUID版本UUID.Variant()
- 获取UUID变体UUID.String()
- 获取标准字符串表示
注意事项
- 该包使用16字节数组表示UUID,而不是字节切片
- 无法表示无效的UUID(与NIL UUID不同)
更多关于golang基于RFC 4122和DCE 1.1标准的UUID生成与验证插件库uuid的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang基于RFC 4122和DCE 1.1标准的UUID生成与验证插件库uuid的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Golang UUID 生成与验证:使用 github.com/google/uuid 库
UUID(通用唯一标识符)是按照 RFC 4122 和 DCE 1.1 标准设计的128位标识符,用于在分布式系统中唯一标识信息。在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 (RFC 4122)
id := uuid.New()
fmt.Println("Generated UUID:", id)
fmt.Println("UUID version:", id.Version())
fmt.Println("UUID variant:", id.Variant())
// 生成版本1的基于时间和MAC地址的UUID
idV1 := uuid.NewUUID()
fmt.Println("Version 1 UUID:", idV1)
// 生成版本3的基于名称和命名空间的UUID
namespaceDNS := uuid.NameSpaceDNS
idV3 := uuid.NewMD5(namespaceDNS, []byte("example.com"))
fmt.Println("Version 3 UUID:", idV3)
// 生成版本5的基于名称和命名空间的UUID
idV5 := uuid.NewSHA1(namespaceDNS, []byte("example.com"))
fmt.Println("Version 5 UUID:", idV5)
}
2. 解析和验证UUID
func parseAndValidate() {
// 从字符串解析UUID
str := "f47ac10b-58cc-0372-8567-0e02b2c3d479"
parsedUUID, err := uuid.Parse(str)
if err != nil {
fmt.Println("Invalid UUID:", err)
return
}
fmt.Println("Parsed UUID:", parsedUUID)
// 检查UUID是否为nil
if parsedUUID == uuid.Nil {
fmt.Println("This is a nil UUID")
}
// 检查UUID版本
if parsedUUID.Version() == 3 {
fmt.Println("This is a version 3 (MD5) UUID")
}
}
3. 自定义UUID生成
func customUUID() {
// 从字节数组创建UUID
bytes := []byte{
0x1b, 0x1d, 0x3f, 0x5e,
0x7a, 0x9c, 0x11, 0x22,
0x33, 0x44, 0x55, 0x66,
0x77, 0x88, 0x99, 0xaa,
}
customUUID, err := uuid.FromBytes(bytes)
if err != nil {
fmt.Println("Error creating UUID from bytes:", err)
return
}
fmt.Println("Custom UUID from bytes:", customUUID)
// 从16字节数组创建UUID(更高效)
var array [16]byte
copy(array[:], bytes)
customUUID2 := uuid.UUID(array)
fmt.Println("Custom UUID from array:", customUUID2)
}
高级功能
1. 排序UUID
func sortedUUIDs() {
// 生成可排序的UUID (版本1或版本2)
uuid1 := uuid.NewUUID()
uuid2 := uuid.NewUUID()
if uuid1.String() < uuid2.String() {
fmt.Println(uuid1, "comes before", uuid2)
} else {
fmt.Println(uuid2, "comes before", uuid1)
}
}
2. 数据库使用
func databaseUsage() {
id := uuid.New()
// 转换为字节切片存储
bytes := id[:]
fmt.Println("UUID as bytes:", bytes)
// 从字节切片恢复
restoredID, err := uuid.FromBytes(bytes)
if err != nil {
fmt.Println("Error restoring UUID:", err)
return
}
fmt.Println("Restored UUID:", restoredID)
}
最佳实践
-
版本选择:
- 需要随机性:使用版本4 (
uuid.New()
) - 需要基于名称的可重复生成:使用版本5 (
uuid.NewSHA1()
) - 需要时间排序:使用版本1 (
uuid.NewUUID()
)
- 需要随机性:使用版本4 (
-
性能考虑:
- 版本4最快,版本1最慢(需要获取系统时间和MAC地址)
- 批量生成时考虑预生成
-
安全性:
- 对于安全敏感场景,确保使用加密安全的随机数生成器(该库默认使用
crypto/rand
)
- 对于安全敏感场景,确保使用加密安全的随机数生成器(该库默认使用
-
存储优化:
- 存储为二进制(16字节)而非字符串(36字符)可节省空间
完整示例
package main
import (
"fmt"
"github.com/google/uuid"
)
func main() {
// 生成并打印各种UUID
fmt.Println("=== UUID Generation Examples ===")
generateExamples()
// 解析和验证示例
fmt.Println("\n=== UUID Parsing and Validation ===")
parseAndValidateExamples()
// 数据库使用示例
fmt.Println("\n=== Database Usage ===")
databaseUsageExample()
}
func generateExamples() {
fmt.Println("Version 4 (random):", uuid.New())
fmt.Println("Version 1 (time-based):", uuid.NewUUID())
fmt.Println("Version 3 (MD5):", uuid.NewMD5(uuid.NameSpaceURL, []byte("https://example.com")))
fmt.Println("Version 5 (SHA1):", uuid.NewSHA1(uuid.NameSpaceURL, []byte("https://example.com")))
}
func parseAndValidateExamples() {
validUUID := "6ba7b810-9dad-11d1-80b4-00c04fd430c8"
invalidUUID := "not-a-uuid"
if id, err := uuid.Parse(validUUID); err == nil {
fmt.Printf("Successfully parsed %s as %v (version %d)\n", validUUID, id, id.Version())
} else {
fmt.Printf("Failed to parse valid UUID: %v\n", err)
}
if _, err := uuid.Parse(invalidUUID); err != nil {
fmt.Printf("Correctly identified %s as invalid: %v\n", invalidUUID, err)
}
}
func databaseUsageExample() {
id := uuid.New()
fmt.Println("Original UUID:", id)
// 存储为字节
dbBytes := id[:]
fmt.Printf("Stored as %d bytes: %x\n", len(dbBytes), dbBytes)
// 从字节恢复
if restored, err := uuid.FromBytes(dbBytes); err == nil {
fmt.Println("Restored UUID:", restored)
} else {
fmt.Println("Restoration error:", err)
}
}
github.com/google/uuid
库提供了符合RFC 4122和DCE 1.1标准的完整UUID实现,支持所有UUID版本(1-5),并提供了丰富的功能来生成、解析和操作UUID。