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 Flow

每次请求生成 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 Generation Flow

流程说明:

  1. 用户通过认证服务获取访问令牌
  2. 向 GUID 服务发起 GUID 请求
  3. GUID 服务生成 MD5 哈希,生成 GUID 并记录日志
  4. 返回 GUID 给客户端

✅ 优势:

  • 可控性强
  • 支持审计与日志追踪
  • 更易符合 ISO27001、SOC2 等安全标准

❌ 劣势:

  • 增加系统复杂度
  • 有网络延迟

5. 总结

GUID 是现代软件系统中用于标识资源、确保唯一性的重要工具。它的生成方式多样,可以根据系统需求选择本地生成或服务端生成。

✅ 关键点总结:

项目 本地生成 服务端生成
响应速度 慢(需网络)
安全性 一般
可控性
是否符合标准 是(如 ISO27001)

几乎所有主流编程语言都提供了生成 GUID 的标准库,开发者可以轻松集成使用。在分布式系统、微服务架构中,GUID 是不可或缺的标识符解决方案。


原始标题:Introduction to GUID