ULID 生成器
生成、解析与校验 ULID:48 位毫秒时间戳 + 80 位随机数,Crockford Base32 编码成 26 个字符,按字典序排序就是时间顺序,并说明如何排序。
浏览器本地运行所有计算都在你的浏览器里完成,数据不会离开本机。
ULID 前 10 个字符是毫秒时间戳,因此直接按字符串(字典序)排序就是时间顺序;同一批生成的 ULID 随机部分递增,结果天然有序。
字符表 0123456789ABCDEFGHJKMNPQRSTVWXYZ(不含 I、L、O、U),首字符最大为 7。
01ARZ3NDEKTSV4RRFFQ69G5FAV
解析 ULID
14699228502592016-07-30T23:54:10.259ZTSV4RRFFQ69G5FAV这个工具能做什么
- 给数据库主键、日志 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生成解析排序