为什么现在不用UUID选择使用ULID?

165 阅读2分钟

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);

好记性不如烂笔头!自我感觉挺有用的