UUID的放弃,切换到ULID

540 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第15天,点击查看活动详情

背景

日常开发中我们会遇到使用字符串ID,最先行到的就是UUID生成我们的随机字符串,但是UUID也是会出现重复的几率的!所以我们引入的新的ULID

ULID的特性

  • 与UUID的128位兼容性

  • 每毫秒1.21e + 24个唯一ULID

  • 按字典顺序(也就是字母顺序)排序!

  • 规范地编码为26个字符串,而不是UUID的36个字符

  • 使用Crockford的base32获得更好的效率和可读性(每个字符5位)

  • 不区分大小写

  • 没有特殊字符(URL安全)

  • 单调排序顺序(正确检测并处理相同的毫秒)

时间戳

  • UNIX时间(以毫秒为单位)
  • 直到公元10889年,他的空间都不会用完
  • 48位整数

排序

最左边的字符必须排在最前面,最右边的字符必须排在最后(词汇顺序)。必须使用默认的ASCII字符集。在同一毫秒内,不能保证排序顺序。

编码方式

使用了Crockford的Base32。该字母表不包括字母I,L,O和U,以避免混淆和滥用。

二进制布局和字节顺序

组件被编码为16个八位位组。每个组件都以最高有效字节在前(网络字节顺序)进行编码。

随机性

  • 80 位的随机数
  • 尽量采用加密技术保证随机数的随机性

使用场景

  • 分布式环境中,替换我们常用的UUID,全局唯一,并且毫秒精度有序
  • 当我们按照日期对数据库进行分库分表的时候,可以使用ULID通过嵌入时间戳来选择我们想要的正确的分库分表
  • 当我们的可以接受的精度为毫秒时候(毫秒内是无序的),可以按照ULID排序。
  • 当然我们也可以用它来替换掉我们数据库中的ID自增,减少数据库对主键的生成依赖

好了,今天关于ULID就先到这,欢迎大家留言交流。

也希望大家关注我的公众号《coder练习生》