跳到主内容
UniKit

ULID 生成器

生成、解析与校验 ULID:48 位毫秒时间戳 + 80 位随机数,Crockford Base32 编码成 26 个字符,按字典序排序就是时间顺序,并说明如何排序。

浏览器本地运行所有计算都在你的浏览器里完成,数据不会离开本机。

ULID 前 10 个字符是毫秒时间戳,因此直接按字符串(字典序)排序就是时间顺序;同一批生成的 ULID 随机部分递增,结果天然有序。

字符表 0123456789ABCDEFGHJKMNPQRSTVWXYZ(不含 I、L、O、U),首字符最大为 7。

结果
01ARZ3NDEKTSV4RRFFQ69G5FAV

解析 ULID

时间戳(毫秒)1469922850259
时间(UTC)2016-07-30T23:54:10.259Z
随机部分TSV4RRFFQ69G5FAV

这个工具能做什么

  • 给数据库主键、日志 ID、订单号用:ULID 按字典序排序就是按时间排序,B 树索引写入更集中,比纯随机 UUID 友好。
  • 批量生成同一毫秒内的有序 ID:一批里的随机部分递增,直接排序即可,不用额外加时间戳字段。
  • 反查 ID 是什么时候生成的:把 26 个字符解析回毫秒时间戳与 UTC 时间,排查「这条记录是什么时候创建的」。
  • 校验外部传入的 ID:检查长度、字符表与首字符,挡掉手写错误的 ID。

示例

输入

01ARZ3NDEKTSV4RRFFQ69G5FAV

输出

时间戳(毫秒):1469922850259
时间(UTC):2016-07-30T23:54:10.259Z
随机部分:TSV4RRFFQ69G5FAV

这是 ULID 规范里的经典样例。前 10 个字符 01ARZ3NDEK 是时间戳,后 16 个字符是随机部分;ULID 大小写不敏感,解析时会统一转成大写。

常见问题

ULID 和 UUID 有什么区别,该选哪个?

ULID 是 26 个字符的 Crockford Base32,可读、可排序、不含连字符,而且直接按字符串排序就是时间顺序;UUID v4 是 36 个字符的纯随机值,无法排序,v7 也是时间有序的但格式更长。要排序或做数据库主键选 ULID 或 UUID v7,要最大兼容性选 UUID。

为什么字符表里没有 I、L、O、U?

这是 Crockford Base32 的设计:去掉容易混淆的 I/L(像 1)、O(像 0)和 U(避免拼出脏词)。解析时也会把大小写视为同一个字符,所以手抄和口头传达都不容易出错。

首字符为什么最大只能是 7?

前 10 个字符承载 48 位时间戳,编码时左对齐到 50 位的空间里,多出来的最高两位必须是 0,所以首字符只能落在 0–7。这也是校验规则的一部分:首字符超过 7 就不是合法 ULID。

同一个毫秒内生成的 ID 会重复吗?

批量生成时这一批共用时间戳,随机部分从同一个随机起点递增,所以既不会重复,结果也天然按字典序排列。跨批次之间依靠 80 位随机数保证不碰撞,理论上需要生成约 2^40 个才会有一半概率冲突。

生成用的随机数从哪来?

来自浏览器内置的 crypto.getRandomValues(密码学安全随机源),不会上传、不会落盘,也没有任何服务端参与。如果运行环境没有 crypto,工具会直接报错而不是退回不安全的 Math.random。

关键词:ulidcrockfordbase32sortable id时间有序唯一 id生成解析排序

同类工具