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())
}

主要功能

  1. 生成UUID:

    • uuid.New() - 生成随机的UUID v4
    • uuid.NewUUID() - 生成基于时间的UUID v1
    • uuid.NewMD5() - 生成基于MD5的命名UUID v3
    • uuid.NewSHA1() - 生成基于SHA-1的命名UUID v5
  2. 解析和验证UUID:

    • uuid.Parse() - 从字符串解析UUID
    • uuid.ParseBytes() - 从字节切片解析UUID
  3. 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)
}

最佳实践

  1. 版本选择

    • 需要随机性:使用版本4 (uuid.New())
    • 需要基于名称的可重复生成:使用版本5 (uuid.NewSHA1())
    • 需要时间排序:使用版本1 (uuid.NewUUID())
  2. 性能考虑

    • 版本4最快,版本1最慢(需要获取系统时间和MAC地址)
    • 批量生成时考虑预生成
  3. 安全性

    • 对于安全敏感场景,确保使用加密安全的随机数生成器(该库默认使用crypto/rand
  4. 存储优化

    • 存储为二进制(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。

回到顶部