跳至内容

KSUID生成器 - 创建可排序的唯一标识符

在线免费生成K-可排序唯一标识符(KSUID),每个27字符的ID内嵌32位时间戳并结合128位随机字节,天然按创建时间顺序排序且几乎不会发生冲突,适合分布式系统、微服务架构和数据库主键使用,一次可批量生成多个标识符,全部计算过程均在浏览器本地完成,无需担心数据泄露风险。

KSUID 生成器

加载计算器...
📚

文档

KSUID 生成器

KSUID(K 可排序唯一标识符)是一种由 27 个字符组成的代码,用于标记数据库行、日志条目或 API 请求等记录。它将时间戳与随机数据结合起来,因此,之后生成的 ID 总会排在之前生成的 ID 后面,同时每个 ID 实际上仍具有唯一性。此工具可在浏览器中生成单个 KSUID,并允许用户复制它。

KSUID 由什么组成?

KSUID 的长度为 20 字节,分为两部分:

  • **时间戳(4 字节):**自称为 KSUID 纪元的固定起点以来经过的秒数。
  • **随机载荷(16 字节):**由浏览器的密码学随机数生成器生成的数据。

这 20 个字节随后使用 base62 编码转换为文本。这是一种使用 62 个字符表示数字的系统,包括数字 0-9、大写字母 A-Z 和小写字母 a-z。结果始终填充至恰好 27 个字符,例如 0qjBBlJIfbVLKwnJn4xpLGDr00e

由于时间戳位于开头,两个相差一秒生成的 KSUID 在作为纯文本比较时,通常会按照与生成时间相同的顺序排序。由于末尾 16 个字节是随机的,在同一秒生成的两个 KSUID 几乎肯定也会不同。

KSUID 纪元

大多数计算机系统以 1970年1月1日(“Unix 纪元”)以来的秒数计时。KSUID 使用不同的起点,即 KSUID 纪元:Unix 纪元之后 1,400,000,000 秒,也就是 UTC 时间 2014年5月13日 16:53:20

使用较晚的起点,可以让 4 字节的时间戳字段在达到容量上限前覆盖更多有用年份。一个 4 字节(32 位)的计数器最多可容纳 4,294,967,295 秒。从 KSUID 纪元开始计算,这段时间大约会在 2150年6月19日 用尽。

KSUID 公式

KSUID 字符串分三个步骤构建。

  1. 求出时间戳值:

    T = floor(current_unix_time_in_seconds) − 1,400,000,000

  2. 使用密码学安全随机数生成器生成 16 个随机字节 R

  3. 将 4 字节的时间戳与 16 个随机字节连接为一个 20 字节的数据块,然后对该数据块进行 base62 编码,并将结果填充至 27 个字符:

    KSUID = Base62( T ‖ R )

这里, 表示“将一个接在另一个之后”。时间戳字节始终位于前面,这正是最终字符串能够按时间正确排序的原因。

计算示例

假设某个 KSUID 的时间戳部分为 100000000。由于 KSUID 纪元是 Unix 纪元之后的 1,400,000,000 秒,该时间戳表示 UTC 时间 2017年7月14日 02:40:00

将该时间戳与 16 字节的序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 配对(这里只是为了让示例可复现;实际生成器使用的是随机字节),经过 base62 编码后得到:

0qjBBlJIfbVLKwnJn4xpLGDr00e

该字符串长度为 27 个字符,仅由数字和字母组成,可直接安全地用于 URL 或文件名。

如何使用 KSUID 生成器工具

  1. 打开 KSUID 生成器页面。
  2. 选择“生成 KSUID”按钮。
  3. 该工具使用当前时间和新生成的随机字节创建一个新的 KSUID,并将其显示在页面上。
  4. 选择“复制 KSUID”按钮,将该值复制到剪贴板。
  5. 选择“重置”以清除结果。“重置”按钮仅在生成 KSUID 后显示。

每次点击“生成 KSUID”都会准确生成一个标识符。要创建多个 KSUID,需要为每个新标识符再次点击该按钮;该工具没有内置批量模式或文件导出功能。

该生成器依赖现代浏览器内置的 Web Crypto API。如果该 API 不可用,工具会显示错误,而不是生成 ID,因为不具备密码学安全性的随机数生成器可能生成更容易猜测或发生碰撞的标识符。

KSUID 与 UUID 的比较

UUID(Universally Unique Identifier,通用唯一标识符)是一种常见的替代标识符格式。使用最广泛的 UUID v4 长度为 36 个字符,几乎完全由随机比特组成,因此两个 UUID 无法透露哪个是先生成的。

KSUID 有三个不同之处:

  • **可按时间排序。**开头的时间戳字节意味着,对 KSUID 字符串进行普通字母排序时,也会按照生成时间排序。
  • **更短。**KSUID 为 27 个字符,而标准 UUID 为 36 个字符。
  • **没有分隔符。**UUID 通常使用连字符书写(xxxxxxxx-xxxx-...);KSUID 不含连字符。

两种格式都可以在不同计算机上独立生成,无需向中央服务器进行检查,因此都避免了共享数据库中自增计数器造成的瓶颈。

常见问题

KSUID 的全称是什么? K-Sortable Unique Identifier。“K”指的是它可以排序(在 Segment 公司的原始设计说明中称为“有点可排序”);Segment 创建了这种格式。

KSUID 有多长? 27 个字符,使用 base62 编码(数字 0-9、大写字母和小写字母)。

什么是 KSUID 纪元? UTC 时间 2014年5月13日 16:53:20,即标准 Unix 纪元 1970年1月1日 之后的 1,400,000,000 秒。

两个 KSUID 会发生碰撞吗? 这种可能性极低。每个 KSUID 都包含 16 个随机字节(128 位),由密码学安全随机数生成器生成。即使在同一秒生成大量 KSUID,两个标识符偶然匹配的概率仍小得近乎不可想象。

可以从 KSUID 中恢复生成时间吗? 可以。解码后数值的前 4 个字节就是时间戳。将该数值所代表的秒数加到 KSUID 纪元上,即可得到原始生成时间。

此工具支持一次生成多个 KSUID 吗? 不支持。每点击一次“生成 KSUID”按钮,工具只生成一个 KSUID。工具没有数量输入框、自定义时间戳字段或导出/下载功能。

KSUID 放入 URL 安全吗? 安全。base62 编码只使用数字和字母,因此 KSUID 出现在 URL、文件名或数据库键中时无需额外转义。

参考文献

  1. Segment 的 KSUID GitHub 仓库:https://github.com/segmentio/ksuid
  2. Peter Bourgon:《"Generating good unique identifiers"》:https://peter.bourgon.org/blog/2019/05/20/generating-good-unique-ids.html