网站首页 > 博客文章 正文
ULID(Universally Unique Lexicographically Sortable Identifier) 是一种轻量级、全局唯一、可排序的标识符格式,是 UUID 的一个优秀替代方案。结合了 UUID 的唯一性和时间顺序性,在分布式系统中非常实用。
一、ULID 的特点
特性 | 描述 |
长度 | 26个字符(比 UUID 的 36 字符更短) |
编码方式 | 使用 Crockford Base32 编码(无大小写敏感,不含 ILOU 等易混淆字符) |
结构 | 前 10 位表示时间戳,后 16 位为随机数 |
排序性 | 可按字典序排序,且时间越晚生成的 ULID 越大 |
唯一性 | 在同一毫秒内通过随机熵保证唯一性 |
紧凑性 | 比 UUID 更短,适合日志、URL、数据库主键等场景 |
示例:
01ARZ3NDEKTSV4RRFFQ69G5FA2
二、ULID 结构详解
ULID 是由两个部分组成:
1. 时间戳部分(前 10 个字符)
- 表示自 Unix 时间起点(1970-01-01)以来的毫秒数。
- 占用 48 位,因此可以使用到公元 10,889 年
2. 随机部分(后 16 个字符)
- 使用 80 位随机数,确保在同一毫秒内生成多个 ULID 也不会重复。
- 如果使用加密安全的随机源,ULID 也可以是“加密安全”的。
三、ULID 相较于 UUID 的优势
对比项 | UUID v4 | ULID |
长度 | 36 字符 | 26 字符 |
是否有序 | 无序 | 按时间排序 |
是否可预测 | 不可预测 | 可预测(取决于实现) |
是否适合数据库主键 | 有性能问题 | 推荐 |
是否适合用于日志、API、URL | 较长 | 更友好 |
是否支持加密安全 | 支持 | 可支持 |
四、应用场景推荐
场景 | 推荐使用 ULID? |
分布式系统 | |
数据库主键(MySQL、PostgreSQL 等) | |
日志 ID、事件 ID | |
API 返回 ID(如 RESTful 接口) | |
URL Slug、短链接 | |
高并发写入场景 | (相比 UUID 更优) |
五、各语言实现(开源库)
以下是主流语言对 ULID 的支持:
语言 | 库名 | GitHub / 链接 |
Python | ulid-py | https://github.com/ahawker/ulid |
JavaScript | ulid | https://www.npmjs.com/package/ulid |
Go | go-ulid | https://github.com/oklog/ulid |
Java | ulid-java | https://github.com/ulid4j/ulid4j |
Rust | ulid-rs | https://github.com/ulid-rs/ulid |
PHP | symfony/uid | Symfony 内置支持 ULID |
Ruby | ulid gem | https://rubygems.org/gems/ulid |
六、Python 示例:使用 ulid-py
pip install ulid-py
import ulid
# 生成一个新的 ULID
uid = ulid.new()
print(uid) # 输出类似:01ARZ3NDEKTSV4RRFFQ69G5FA2
# 将 ULID 转换为字符串
print(str(uid))
# 获取 ULID 的时间戳部分
timestamp = uid.timestamp()
print(timestamp.datetime) # 输出对应的 datetime 对象
七、MySQL 中如何存储 ULID?
建议使用 CHAR(26) 或 VARCHAR(26) 类型来存储 ULID:
CREATE TABLE example (
id CHAR(26) PRIMARY KEY,
name VARCHAR(255)
);
如果追求更高的效率,也可以将时间戳部分和随机部分拆分成两个字段进行存储。
八、与 Snowflake ID 的比较
特性 | ULID | Snowflake |
唯一性 | ||
可排序 | ||
可读性 | 不直观 | |
实现复杂度 | 简单 | 复杂(需部署节点 ID、时钟同步) |
依赖中心服务 | 否 | 通常需要 |
存储空间 | 26 字符 | 64 位整数 |
安全性 | 可加密安全 | 可预测(如果知道算法) |
九、总结:什么时候应该使用 ULID?
推荐使用 ULID 的情况:
- 你希望 ID 有一定的排序性;
- 你希望在不同服务之间生成唯一的 ID;
- 你需要一个比 UUID 更短、更友好的 ID;
- 你不希望引入复杂的 ID 生成服务(如 Snowflake);
- 你想在日志、API、前端展示中使用简洁的 ID。
不建议使用 ULID 的情况:
- 你对 ID 的生成速度要求极高;
- 你需要严格的加密安全性(虽然 ULID 可以做到,但不是默认);
- 你的系统已经使用了 Snowflake 或其他成熟方案。
如果正在设计一个新系统,并希望选择一个既具备唯一性又具有一定排序性的 ID 方案,ULID 是一个非常值得考虑的选择。
猜你喜欢
- 2025-07-28 告别频繁登录!Nuxt3 + TS + Vue3实战:双Token无感刷新方案全解析
- 2025-07-28 SpringBoot实现单点登录(SSO)的4种方案
- 2025-07-28 随机密聊 匿名聊天室程序源码(随机匿名聊天在线)
- 2025-07-28 SpringBoot大文件上传卡死?分块切割术搞定GB级传输,速度飙升!
- 2025-07-28 Java 微服务从源码实战开始 | Gitee 项目推荐
- 2025-07-28 轻量级埋点sdk搭建,便捷更全面(埋点sdk是什么)
- 2025-07-28 Spring Boot 实现文件秒传功能(springboot上传文件到指定文件夹)
- 2025-07-28 项目中不用redis分布式锁,怎么防止用户重复提交?
- 2025-07-28 SpringBoot项目日志打印traceId生成
- 2025-07-28 如何实现PC端网站扫码登录操作?(网页 扫码)
你 发表评论:
欢迎- 08-06nginx 反向代理
- 08-06跨表插入连续的日期,sheetsname函数#excel技巧
- 08-06初中生也能学的编程,不走弯路,先用后学
- 08-06find命令的“七种武器”:远不止-name和-type
- 08-06恶意代码常见的编程方式
- 08-06kali2021ping 外网不通
- 08-06因为一个函数strtok踩坑,我被老工程师无情嘲笑了
- 08-06hadoop集群搭建详细方法
- 23℃nginx 反向代理
- 最近发表
- 标签列表
-
- ifneq (61)
- 字符串长度在线 (61)
- googlecloud (64)
- powershellfor (73)
- messagesource (71)
- plsql64位 (73)
- vueproxytable (64)
- npminstallsave (63)
- #NAME? (61)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- nacos启动失败 (64)
- ssh-add (70)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- qcombobox样式表 (68)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)