在软件开发中,经常需要生成 唯一标识符(UUID)。例如:
- 用户 ID
- 订单号
- 文件唯一标识
- API 请求 ID
- 分布式系统对象 ID
在 Go 语言生态中,最常用、最稳定的 UUID 库之一是:
该库由 Google 维护,广泛应用于各种 Go 项目中。
一、什么是 UUID
UUID(Universally Unique Identifier)是一种通用唯一标识符。
标准由 Internet Engineering Task Force(IETF)定义。
UUID 通常是一个 128 位数字,常见字符串格式为:
550e8400-e29b-41d4-a716-446655440000
结构形式:
8-4-4-4-12
例如:
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
UUID 的核心特点:
- 全球唯一
- 不依赖中心服务器
- 可以离线生成
- 适合分布式系统
二、google/uuid 库介绍
github.com/google/uuid 是 Go 官方生态中最常用的 UUID 库之一。
主要特点:
- API 简洁
- 生成速度快
- 支持多个 UUID 版本
- 维护稳定
- 生产环境广泛使用
支持的 UUID 类型:
- UUID v1(时间 + MAC 地址)
- UUID v3(基于 MD5)
- UUID v4(随机)
- UUID v5(基于 SHA1)
其中使用最多的是:
UUID v4(随机 UUID)。
三、安装库
在 Go 项目中安装:
bash
go get github.com/google/uuid
导入包:
go
import "github.com/google/uuid"
四、生成随机 UUID(最常用)
UUID v4 是随机生成的 UUID,也是使用最多的一种。
示例代码:
go
package main
import (
"fmt"
"github.com/google/uuid"
)
func main() {
id := uuid.New()
fmt.Println(id)
}
输出示例:
c4d61c4a-1d9f-4c62-b7c8-2d8b7a9e89d1
每次运行都会生成不同的 UUID。
五、UUID 转字符串
如果需要保存到数据库或返回 API,可以转换为字符串。
go
id := uuid.New()
str := id.String()
fmt.Println(str)
输出:
r
3d2a9b0b-45fd-4e8c-9c35-d2f5e8d93a12
六、解析 UUID
如果接收到字符串形式的 UUID,可以解析为 UUID 类型。
go
idStr := "550e8400-e29b-41d4-a716-446655440000"
id, err := uuid.Parse(idStr)
if err != nil {
panic(err)
}
fmt.Println(id)
解析成功后可以继续使用。
七、生成 UUID v1
UUID v1 基于时间戳和 MAC 地址生成。
示例:
go
id, err := uuid.NewUUID()
if err != nil {
panic(err)
}
fmt.Println(id)
特点:
- 可排序
- 含时间信息
- 包含机器标识
但存在隐私问题,因此使用不如 v4 常见。
八、基于名称生成 UUID
UUID v3 和 v5 是基于名称生成的。
适用于:
- 相同输入生成相同 UUID
- 数据去重
- 哈希标识
示例:
go
id := uuid.NewSHA1(uuid.NameSpaceDNS, []byte("example.com"))
fmt.Println(id)
同样输入将得到相同 UUID。
九、判断 UUID 是否为空
可以检查 UUID 是否为零值。
go
var id uuid.UUID
if id == uuid.Nil {
fmt.Println("UUID 为空")
}
uuid.Nil 表示:
00000000-0000-0000-0000-000000000000
十、数据库存储建议
在数据库中存储 UUID 时通常有两种方式:
方式一:字符串
长度:
36 字符
例如:
scss
varchar(36)
优点:
- 可读性好
- 调试方便
方式二:二进制
UUID 实际是:
python
16 bytes
数据库可以存储为:
scss
BINARY(16)
优点:
- 占用空间小
- 查询更快
十一、典型应用场景
UUID 在很多系统中都有应用,例如:
用户唯一 ID 订单编号 文件 ID 日志追踪 ID 微服务请求 ID 分布式对象 ID
例如:
go
requestID := uuid.New().String()
用于 API 日志追踪。
十二、性能情况
UUID v4 的生成速度非常快。
在 Go 中每秒可以生成:
几十万到上百万个 UUID。
因此完全适合:
- 高并发系统
- 分布式服务
- 微服务架构
十三、常见问题
UUID 是否绝对唯一
理论上不是绝对唯一,但概率极低。
UUID v4 的随机空间是:
2^122
几乎不可能重复。
UUID 是否可以排序
普通 UUID v4 不可排序。
如果需要排序,可以使用:
- UUID v1
- 或时间排序 ID(例如 Snowflake)。
十四、总结
github.com/google/uuid 是 Go 生态中最常用的 UUID 生成库之一。
主要优点:
- 官方背景稳定
- API 简洁
- 性能优秀
- 支持多种 UUID 版本
在 Go 项目中,如果需要生成唯一 ID,使用该库可以非常快速地实现稳定可靠的 UUID 方案。
它也是构建分布式系统、微服务架构和高并发系统时的重要基础组件之一。