分布式系统中唯一标识符的高效CUID生成器
CUID生成器可在浏览器本地环境中即时创建符合CUID2标准、具有防冲突特性的唯一标识符字符串,适用于数据库主键设计、分布式系统节点标识和各类Web应用程序的对象编号需求。生成的标识符本身具有可扩展性和天然的可排序性,属于完全免费且无需注册的开发者工具,速度快捷。
CUID 生成器
快速轻松地生成防冲突ID。
文档
什么是 CUID?
CUID(抗碰撞唯一标识符)是由字母和数字组成的短字符串,用来标记一条记录、一个文件或一个事件,使任何两个条目都不会重名。本工具生成的是该格式的当前版本 CUID2,使用@paralleldrive/cuid2 库。每个 ID 长 25 个字符,只含小写字母和数字,完全在浏览器中生成。不会向服务器发送任何内容。
如何使用此 CUID 生成器
- 点击 生成新的 CUID 以创建 ID。
- 点击 复制到剪贴板 进行复制。
- 将 ID 粘贴到数据库、文件名或应用程序中。
- 再次点击“生成”以获取另一个 ID。不同 CUID2 值之间发生碰撞的可能性极低,但在数学上并非不可能。
生成的 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 个字符。本工具请求的长度是 25。
只有第一个字符是独立的:它是放在最前面的一个随机字母,使每个 ID 都以字母而不是数字开头。该库的作者称,这个起始字母使 ID 可以用作 JavaScript 和 HTML/CSS 中可用的标识符。第一个字母之后的每个字符都属于同一个连续、不透明的哈希主体,没有单独的分段。
由于哈希只能单向运算,无法从最终 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 的比较
| 特性 | CUID2 | UUID v4 | 自动递增 |
|---|---|---|---|
| 长度 | 25 个字符 | 36 个字符(含连字符) | 可变(通常是较短的数字) |
| 字符集 | 小写字母和数字 | 十六进制数字和连字符 | 数字 |
| 需要中央协调 | 否 | 否 | 是(数据库序列) |
| 可按创建时间排序 | 否 | 否 | 是 |
| 无需编码即可用于 URL | 是 | 在连字符附近需要格外小心 | 是 |
CUID2 与 UUID v4 解决的是同一个问题:无需集中协调即可生成 ID。UUID 是 128 位,以“十六进制加连字符”的字符串格式书写,包含 32 个十六进制数字和 4 个连字符。CUID2 更短,使用的字符集也更小,因此更容易阅读,也更容易粘贴进网址。
常见用途
- 由多台服务器独立插入行的分布式数据库中的主键
- 用于在多个微服务之间跟踪同一操作的请求 ID 或跟踪 ID
- 上传文件的文件名,确保两个文件不会相互覆盖
- Web 应用程序的会话 ID 或令牌 ID
- Kafka 或 RabbitMQ 等队列中的消息 ID
简史
最初的 CUID 格式由 Eric Elliott 创建,作为分布式应用中 UUID 的替代方案。它现已被弃用,改用 CUID2。CUID2 由同一个 Paralleldrive 项目发布,围绕加密哈希重新设计了格式,并去掉了原版暴露的可恢复的时间戳和计数器。本工具只生成 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 列。
参考文献
- Paralleldrive。Cuid2(README)。github.com/paralleldrive/cuid2 — 熵来源、起始字母、36 进制输出、默认长度 24、不可恢复的输入,以及
createdAt建议。 - Paralleldrive。Cuid(已弃用)。github.com/paralleldrive/cuid — 由 Eric Elliott 创建的原版 CUID,已弃用,改用 Cuid2。
- IETF。RFC 9562: Universally Unique IDentifiers (UUIDs). rfc-editor.org — 128 位 UUID、十六进制加连字符的字符串格式、无需集中注册。