免费UUID生成器 - 即时创建V1和V4 UUID
在线生成版本1基于时间戳与网卡地址和版本4基于随机数这两种最常用的UUID标识符。免费工具详细说明UUID各字段的具体格式结构、生成所用的算法逻辑以及所遵循的RFC 4122国际标准,适用于数据库主键设计、分布式系统节点标识和API接口中需要全局唯一ID的开发场景。
UUID生成器
文档
通用唯一标识符生成器
通用唯一标识符生成器是一种创建通用唯一标识符的工具:通用唯一标识符是一种 128 位代码,用于标记数据项,因此世界任何地方的其他数据项都几乎不可能拥有相同的标记。本页面生成版本 1(基于时间)和版本 4(随机)通用唯一标识符。
什么是 UUID?
UUID 是一个 128 位的数,写成 32 个十六进制数字(字符 0-9 和 a-f)。它被连字符分成五组,格式为 8-4-4-4-12,共 36 个字符。UUID 示例如下:
1550e8400-e29b-41d4-a716-446655440000
2UUID 由互联网工程任务组的标准定义。该标准的第一版 RFC 4122 于 2005 年七月发布。2024 年五月,RFC 9562 取代了它,废止 RFC 4122,并新增了若干版本。软件用 UUID 标识数据库行、文件和其他记录,无需中央机构来分配编号。由于可能的 UUID 空间极其庞大,两台计算机可以同时各自独立生成 UUID,而几乎不会得到相同的结果。
UUID 的格式和结构
UUID 的 128 个位分为多个命名字段。每个字段占用固定数量的位:
time_low- 32 位time_mid- 16 位time_hi_and_version- 16 位clock_seq_hi_and_reserved- 8 位clock_seq_low- 8 位node- 48 位
time_hi_and_version 中的四位标记 UUID 的版本号,clock_seq_hi_and_reserved 中的两位标记变体,变体告诉软件如何读取其余字段。
如何使用此工具生成 UUID
- 选择一个版本:版本 1(基于时间)或版本 4(随机)。
- 选择“生成”。工具会立即生成一个新的 128 位 UUID。
- 选择“复制”将结果复制到剪贴板。
- 将 UUID 粘贴到代码、数据库或配置文件中。
版本 4 适合大多数用途,例如数据库主键,因为它不包含生成时间或生成地点的任何信息。版本 1 会记录生成时间,在需要知道记录创建时间时可能有用。
UUID 版本 1 与版本 4
版本 1 编码当前时间戳,外加时钟序列和节点值。原标准允许节点值使用计算机真实的网络(MAC)地址。新标准指出 MAC 地址存在隐私风险,不应使用,并允许改用随机节点值。本工具的节点始终使用随机位,因此其版本 1 UUID 绝不会读取或暴露真实的 MAC 地址。按照标准对随机节点的要求,工具会将节点第一个八位字节的最低有效位(组播位)设为 1,以表明该节点是随机值,而非真实的网络地址。工具的时钟以毫秒为单位读取时间,因此时间戳最小的几位始终为零。
版本 1 的 UUID 按文本排序时并不遵循创建时间顺序。时间戳中变化最快的部分 time_low 排在最前面,所以较晚生成的 UUID 可能排在较早生成的之前。RFC 9562 新增了版本 6,即版本 1 的重排形式,以便更好地用于数据库排序,并指出新系统应尽可能使用版本 7,而不是版本 1 和 6。
版本 4 由随机位构成,其中少数位固定用于标记版本和变体。它不包含时间戳或特定于机器的数据,因此不会泄露创建时间或创建位置。它无法按创建顺序排序。
标准中还有其他版本,但本工具不生成。版本 2 保留给 DCE 安全。版本 3 和 5 通过 MD5 或 SHA-1 对命名空间和名称进行哈希运算而生成,因此相同的输入总会得到相同的 UUID。版本 6、7 和 8 由 RFC 9562 新增。
如何计算 UUID(公式)
版本 4:
- 生成 128 个随机位。工具从 Web Crypto API(
crypto.getRandomValues)获取这些位,这是一个密码学安全的来源;只有在该 API 不可用时,才会退而使用Math.random。 - 将四个版本位(第三组的第一个十六进制数字)设置为
0100(十六进制4)。 - 将第四组的最高两位设置为
10(因此该组的第一个十六进制数字为8、9、a或b)。
只有 122 位(总共 128 位)是随机的,因为有 6 位已由步骤 2 和 3 固定。这样共有 2^122(约 5.3 × 10^36)种可能的版本 4 UUID。
版本 1:
- 取当前时间,表示为100 纳秒为间隔、自 1582年10月15日 起计的数量,该日期是格里高利历改革之日。这会填充
time_low、time_mid以及time_hi_and_version的一部分。 - 生成一个随机的 14 位时钟序列,用于在系统时钟被回拨时避免重复。
- 生成一个随机的 48 位节点值,然后将组播位(其第一个字节的最低有效位)设为 1。时钟序列和节点来自与版本 4 相同的一次 Web Crypto 取值,并有相同的
Math.random备用方案。 - 将版本位设置为
0001,将变体位设置为10。
在所有 UUID 版本中,完整的 128 位空间共有 2^128 个可能的值,约为 3.4 × 10^38 个。
算例
以前面的示例 UUID 为例:550e8400-e29b-41d4-a716-446655440000。
- 第三组
41d4:第一个数字为4,表示这是版本 4 UUID。 - 第四组
a716:第一个数字a(二进制1010)以10开头,这就是要求的变体位。 - 其余十六进制数字是随机载荷。
读取该 UUID 的程序会检查 4 和 10 的模式以确认格式,然后把其余部分当作不透明的值处理。
UUID 的常见用途
- 数据库中的主键,尤其适用于多个服务器同时创建记录而无需相互通信的情况。
- 分布式系统(如微服务)中的文件、事件和资源标识符。
- 大型网络中的设备 ID,每台设备都可以离线生成自己的 ID。
UUID 不应用作密码、会话密钥或 API 密钥。标准指出,实现不得将 UUID 用作安全能力凭据,即仅凭知晓就能获得访问权限的 ID。
主要的代价是体积:一个 UUID 占用 16 字节存储空间,而简单的整数计数器只需 4 或 8 字节。版本 4 等随机 UUID 的数据库索引局部性也较差:新值会落在索引中的随机位置,可能拖慢插入速度。
UUID 的替代方案
自增整数更小、更简单,但一旦有多台服务器需要各自独立分配 ID,就不再适用。为解决排序问题,出现了几种按时间排序的 ID 方案,RFC 9562 将它们作为背景列出,其中包括 Twitter 的 Snowflake 和 ULID。ULID 与 UUID 一样为 128 位,并且可按字典序排序,即按文本排序时就是创建顺序。对于新系统,UUID 版本 7 在 UUID 标准内提供了同样的好处。
UUID 标准的历史
UUID 最早用于Apollo 网络计算系统,随后用于开放软件基金会的分布式计算环境,再后来用于 Microsoft Windows。互联网工程任务组发布 RFC 4122 的时间是 2005 年七月,以 RFC 9562 取代它是在 2024 年五月。
常见问题
UUID 生成器有什么用途? 它为数据库、分布式系统和设备 ID 创建唯一标识符,使任何两条记录都不必共用同一个标识符。
UUID v1 和 v4 有什么区别? 版本 1 编码时间戳。版本 4 除版本位和变体位外都是随机的,不含时间戳。本工具输出的版本 1 使用随机节点值而非真实的 MAC 地址,因此不会暴露能识别机器的信息。
版本 1 会暴露我的 MAC 地址吗? 本工具不会。原标准允许版本 1 UUID 的节点字段存放真实的 MAC 地址,但本生成器始终用随机位填充该字段,并设置组播位以标明它是随机值。
UUID 能保证唯一吗? 任何标识符方案都无法保证绝对唯一,但版本 4 UUID 约有 5.3 × 10^36 个可能的随机值。只要随机数质量良好,出现重复的概率小到几乎在任何实际用途中都可以忽略。
可以把 UUID 用作数据库主键吗? 可以。UUID 在分布式系统中很适合作主键,因为任何节点都能生成,无需与中央服务器核对。代价是每个主键占用 16 字节存储空间,并且对随机版本而言,在超大表上插入会更慢。
UUID 与 GUID 相同吗? 相同。RFC 9562 指出,UUID 也称为 GUID(全局唯一标识符),这是 Microsoft 平台上使用的名称。
版本 1 或版本 4 的 UUID 可以按创建时间排序吗? 按文本排序不行。版本 4 是随机的,而版本 1 把时间戳中变化最快的部分放在最前面。若需要按创建顺序排序的 ID,请使用 UUID 版本 7 或 ULID。
参考文献
- 互联网工程任务组。RFC 9562: Universally Unique IDentifiers (UUIDs)。RFC 9562 — 废止 RFC 4122(2024 年五月);122 个随机位(版本 4);版本 6 和 7,以及优先使用版本 7 的建议;不应使用 MAC 地址;UUID 不得用作安全能力凭据;版本 4 的索引局部性较差;Apollo NCS、OSF DCE 和 Microsoft 的历史;GUID 是另一种名称。
- 互联网工程任务组。RFC 4122: A Universally Unique IDentifier (UUID) URN Namespace。RFC 4122 — 2005 年七月发布;版本 1 时间戳以 100 纳秒为间隔,自 1582年10月15日 起计。
- ULID 项目。Universally Unique Lexicographically Sortable Identifier。ULID 规范 — 与 UUID 的 128 位兼容,并支持字典序排序。