对比
UUID v7 与 ULID 对比
两者都是 128 位,也都以 Unix 毫秒时间戳开头。它们不是同一种标识:ULID 没有版本和变体,常见文本是 Crockford base32。
| UUID v7 | ULID | |
|---|---|---|
| 宽度 | 128 位 | 128 位 |
| 时间戳 | 48 位 Unix 毫秒 | 48 位 Unix 毫秒 |
| 时间戳之后 | 4 位版本、12 位 rand_a、2 位变体、62 位 rand_b | 80 位随机数 |
| 常见文本 | 36 字符,十六进制加连字符 | 26 字符,Crockford base32 |
| 版本字段 | 7 | 没有 |
| 单调选项 | RFC 9562 允许;本站使用随机位 | ULID 规范描述了在同一毫秒里递增随机部分 |
| 原生 UUID 类型 | 版本和变体按规范设置时可以 | 不是。它是另一种标识 |
列、接口或解析器已经要求 UUID 时,用 UUID v7。周围系统已经使用 26 字符文本时,用 ULID。把字节抄过去并不会改变生成这些字节的那份规范。
常见问题
它们都是同样的 128 位吗?
两者都是 128 位,也都以 48 位 Unix 毫秒时间戳开头。ULID 后面是 80 位随机数。UUID v7 要留出 4 位版本和 2 位变体,RFC 9562 定义的随机部分是 74 位。
可以把 ULID 存进 UUID 列吗?
ULID 不是 UUID。有的代码把 16 字节 ULID 写进 uuid 列,但版本半字节就变成那些位碰巧的值。那个值不是 UUID v7。
哪种文本会排序?
ULID 的 26 位 Crockford base32 文本按时间排序。标准 UUID v7 十六进制字符串也会按毫秒排序,因为时间戳在前,连字符的位置是固定的。