1. 简介
在本教程中,我们将介绍 GUID(Globally Unique Identifier),也就是我们常说的 UUID(Universally Unique Identifier)。
GUID 是一个 128 位的序列,理论上它的重复概率极低(约为 10⁻³⁶)。在实际应用中,我们可以认为它是唯一的。
✅ 为什么叫 GUID 或 UUID?
这两个术语在不同语境中使用。GUID 更常见于微软生态和部分数据库系统,而 UUID 则是通用术语。两者本质上是同一个东西。
2. 使用 GUID 的场景与原因
假设我们有十个客户端应用,它们各自生成交易数据并插入到数据库中。如果这些数据的主键需要全局唯一,那么我们可以使用 GUID 来保证唯一性。
✅ 常见使用场景:
- 客户端独立生成主键 ID,无需依赖数据库自增或中心服务
- 避免主键冲突,尤其在分布式系统中
- 日志追踪、API 请求标识,便于调试和监控
- 符合安全标准(如 ISO27001)时,可通过中心服务器统一生成 GUID
⚠️ 踩坑提示:
不要在高并发场景下使用自增 ID 拼接字符串作为唯一标识,极易冲突。GUID 是更可靠的选择。
3. GUID 的结构
GUID 通常由 32 位十六进制字符组成,格式如下:
XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
例如:
44150258-9728-4eaf-a2b7-11da-cc97b98b47c7
✅ GUID 的组成原理
最常见的 GUID 版本是 基于时间戳和 MAC 地址生成的 UUID Version 1,结构如下:
- 时间戳:精确到 100 纳秒的时间值,确保时间唯一性
- MAC 地址:网卡的唯一标识,6 字节,共 12 位十六进制数
生成流程如下图所示:
每次请求生成 GUID 时,系统会获取当前 CPU 时间戳和 MAC 地址,然后结合两者生成唯一的字符串。
❌ 问题提示:
MAC 地址泄露可能带来安全风险,因此现代系统更倾向于使用 UUID Version 4(随机生成)。
4. 实际生成 GUID 的方式
GUID 可以在本地生成,也可以通过服务端统一生成。以下是两种方式的对比:
4.1 本地生成 GUID
大多数编程语言都内置了 GUID 生成模块。例如 Python 中的 uuid
模块:
import uuid
id = uuid.uuid4().hex
连续调用两次 uuid4()
会得到两个不同的 GUID:
4415025897284eafa2b711dacc97b98b
b47c791b68374ff6baaf00cfb127d321
✅ 优势:
- 无需网络请求
- 低延迟
- 高可用
❌ 劣势:
- 无法集中管理 GUID
- 安全性较弱(随机 GUID 可能被预测)
4.2 在线生成 GUID
在金融或高安全要求的系统中,企业通常会部署自己的 GUID 服务。流程如下:
流程说明:
- 用户通过认证服务获取访问令牌
- 向 GUID 服务发起 GUID 请求
- GUID 服务生成 MD5 哈希,生成 GUID 并记录日志
- 返回 GUID 给客户端
✅ 优势:
- 可控性强
- 支持审计与日志追踪
- 更易符合 ISO27001、SOC2 等安全标准
❌ 劣势:
- 增加系统复杂度
- 有网络延迟
5. 总结
GUID 是现代软件系统中用于标识资源、确保唯一性的重要工具。它的生成方式多样,可以根据系统需求选择本地生成或服务端生成。
✅ 关键点总结:
项目 | 本地生成 | 服务端生成 |
---|---|---|
响应速度 | 快 | 慢(需网络) |
安全性 | 一般 | 高 |
可控性 | 差 | 强 |
是否符合标准 | 否 | 是(如 ISO27001) |
几乎所有主流编程语言都提供了生成 GUID 的标准库,开发者可以轻松集成使用。在分布式系统、微服务架构中,GUID 是不可或缺的标识符解决方案。