ULID :Universally Unique Lexicographically Sortable Identifier(通用唯一词典分类标识符)
UUID :Universally Unique Identifier(通用唯一标识符)
UUID 目前有 5 个版本:
- 1.在许多环境中是不切实际的,因为它需要访问唯一的,稳定的MAC地址,容易被攻击;
- 2.将版本 1 的时间戳前四位换为 POSIX 的 UID 或 GID,问题同上;
- 3.基于 MD5 哈希算法生成,生成随机分布的ID需要唯一的种子,这可能导致许多数据结构碎片化;
- 4.基于随机数或伪随机数生成,除了随机性外没有提供其他信息;
- 5.通过 SHA-1 哈希算法生成,生成随机分布的ID需要唯一的种子,这可能导致许多数据结构碎片化;
为什么选择ULID? 优点:
- 1.与UUID的128位兼容性
- 2.每毫秒1.21e + 24个唯一ULID
- 3.按字典顺序(也就是字母顺序)排序!
- 4.规范地编码为26个字符串,而不是UUID的36个字符
- 5.使用Crockford的base32获得更好的效率和可读性(每个字符5位)
- 6.不区分大小写
- 7.没有特殊字符(URL安全)
- 8.单调排序顺序(正确检测并处理相同的毫秒)
那ULID应用场景是那些?
- 1.替换数据库自增id,无需DB参与主键生成
- 2.分布式环境下,替换UUID,全局唯一且毫秒精度有序
- 3.比如要按日期对数据库进行分区分表,可以使用ULID中嵌入的时间戳来选择正确的分区分表
- 4.如果毫秒精度是可以接受的(毫秒内无序),可以按照ULID排序,而不是单独的created_time字段
那小白如何使用ULID?
java后端要在Maven项目中引入依赖,这里选用ulid-creator实现:
<dependency> <groupId>com.github.f4b6a3</groupId> <artifactId>ulid-creator</artifactId> <version>5.1.0</version> </dependency>
然后调用UlidCreator.getUlid()系列方法
Ulid ulid = UlidCreator.getUlid(); System.out.println("常规"+ulid); Ulid ulid2 = UlidCreator.getMonotonicUlid(); System.out.println("单调排序"+ulid2);
好记性不如烂笔头!自我感觉挺有用的