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

注意事项

  1. github.com/google/uuid 支持 RFC 4122 定义的UUID标准
  2. 版本4 (随机) UUID是最常用的,除非你有特殊需求需要使用其他版本
  3. 该库线程安全,可以在并发环境中使用
  4. 解析时如果格式不正确会返回错误
  5. UUID作为主键时,比自增ID更适合分布式系统

这个库简单易用,基本上能满足大多数Golang项目中UUID相关的需求。对于更高级的用例,你可能需要查看库的源代码或文档以了解更详细的功能。

回到顶部