跳至内容

分布式系统中唯一标识符的高效CUID生成器

CUID生成器可在浏览器本地环境中即时创建符合CUID2标准、具有防冲突特性的唯一标识符字符串,适用于数据库主键设计、分布式系统节点标识和各类Web应用程序的对象编号需求。生成的标识符本身具有可扩展性和天然的可排序性,属于完全免费且无需注册的开发者工具,速度快捷。

CUID 生成器

快速轻松地生成防冲突ID。

点击“生成新CUID”创建一个 id。
加载计算器...
📚

文档

什么是 CUID?

CUID(抗碰撞唯一标识符)是一种由字母和数字组成的短字符串,用于标记记录、文件或事件,使任意两个项目不会共享同一名称。此工具使用 @paralleldrive/cuid2 库生成 CUID2,即该格式的当前版本。每个 ID 长 25 个字符,仅包含小写字母和数字,并完全在浏览器中创建——不会向服务器发送任何内容。

如何使用此 CUID 生成器

  1. 点击 生成新的 CUID 以创建 ID。
  2. 点击 复制到剪贴板 进行复制。
  3. 将 ID 粘贴到数据库、文件名或应用程序中。
  4. 再次点击“生成”以获取另一个 ID。不同 CUID2 值之间发生碰撞的可能性极低,但在数学上并非不可能。
  5. 点击 重置 清除结果。

生成的 ID 也会存储在页面 URL 中,因此可以分享或收藏指向该结果的链接。

CUID2 的结构和公式

CUID2 的构成如下:

1id = randomLetter + base36( SHA3-512( time + entropy + counter + fingerprint ) ).substring(1, length)
2

哈希函数混合四个私有输入:当前时间、每个会话的计数器、主机计算机的指纹以及随机熵。它将这些输入通过 SHA3-512 处理,把结果转换为 36 进制(数字 0–9 和字母 a-z),然后保留其中的 24 个字符。随机的首字母使完整 ID 达到 25 个字符,即此工具设定的长度。

只有第一个字符独立存在:它是置于开头的随机字母,确保每个 ID 都以字母而非数字开头。许多系统(例如 SQL 表名和列名)要求标识符以字母开头,因此 CUID2 几乎在任何地方都可以安全地用作名称。第一个字母之后的每个字符都属于连续且不透明的哈希主体,不包含独立的分段。

由于哈希只能单向运算,无法从最终 ID 中提取出任何输入。CUID2 不包含可恢复的时间戳、计数器或指纹。这是出于隐私和安全考虑的有意设计:仅凭 ID 无法得知它是在何时或何处创建的。

算例

使用此工具生成的 ID 可能如下:

1vcpuhcj51eomj1o31dnlqopu0
2

其中,v 是随机的首字母,cpuhcj51eomj1o31dnlqopu0(24 个字符)是哈希主体。两部分之所以看起来不同,仅仅是因为第一个字符保证为字母,而哈希主体可以混合使用字母和数字。

系统为何使用 CUID2

  • 无需协调。 任何计算机都可以独立生成有效 ID,无需向中央服务器或数据库请求下一个值。
  • 抗碰撞性。 时间、计数器、主机指纹和随机熵的混合,使两台计算机生成相同 ID 的可能性极低,即使每秒生成许多个 ID 也是如此。
  • 适合 URL。 CUID2 只使用小写字母和数字,因此用于网址时无需编码。
  • 生成快速且保护隐私。 由于此工具在浏览器中运行生成器,ID 会即时创建,且不会离开设备。

CUID2 ID 不能按创建时间排序。与数据库自动递增数字或旧版 CUID(版本 1)格式不同,CUID2 将时间戳隐藏在哈希中,而不是明文存储。需要按创建顺序排序记录的应用程序,应在 ID 旁单独存储时间戳列。

CUID2、UUID 与自动递增 ID 的比较

特性CUID2UUID v4自动递增
长度25 个字符36 个字符(含连字符)可变(通常是较短的数字)
字符集小写字母和数字十六进制数字和连字符数字
需要中央协调否否是(数据库序列)
可按创建时间排序否否是
无需编码即可用于 URL是是是

CUID2 和 UUID v4 解决的是同一个问题:在无需中央协调的情况下生成 ID。CUID2 更短且使用更小的字符集,因此更易阅读和粘贴到 URL 中。UUID 同样可以安全地用于网址,因为连字符在 URL 中属于非保留字符,但它长 11 个字符。

常见用途

  • 由多台服务器独立插入行的分布式数据库中的主键
  • 用于在多个微服务之间跟踪同一操作的请求 ID 或跟踪 ID
  • 上传文件的文件名,确保两个文件不会相互覆盖
  • Web 应用程序的会话 ID 或令牌 ID
  • Kafka 或 RabbitMQ 等队列中的消息 ID

简史

原始 CUID 格式由 Eric Elliott 于 2012 发布,作为分布式应用程序中 UUID 的替代方案。由同一 Paralleldrive 项目发布的 CUID2 以加密哈希为基础重新设计了格式,并移除了原始版本公开的可恢复时间戳和计数器。此工具仅生成 CUID2 ID。

常见问题

CUID(v1)与 CUID2 有什么区别? CUID v1 将可见的时间戳和计数器存储在 ID 中,这使 ID 可以排序,但也泄露了创建时间以及已创建的 ID 数量。CUID2 用单向哈希替代这些可见字段,因此无法从 ID 中读取出任何信息。

此工具生成的 CUID 可以按创建时间排序吗? 不可以。CUID2 不包含可恢复的时间戳,因此仅查看字符串无法按生成时间对 ID 排序。

生成的 ID 有多长?可以更改长度吗? 此工具始终生成长度为 25 个字符的 ID。此工具没有请求其他长度的选项。

两台不同的计算机能否同时生成相同的 CUID2? 理论上可能,但在实际中极不可能。每个 ID 都将主机专属指纹与随机熵混合,因此独立的计算机几乎不可能生成相同的哈希。

此工具会向服务器发送任何数据吗? 不会。ID 由浏览器中运行的 JavaScript 使用本地系统时钟和浏览器提供的随机数生成。不会传输任何内容。

可以将 CUID2 用作数据库主键吗? 可以。CUID2 ID 很适合用作分布式数据库中的主键,因为任何节点都可以生成 ID,无需向中央序列查询。它们不会按插入时间自然排序,因此需要该顺序的应用程序应另外保留一个 created_at 列。