持续创作,加速成长!这是我参与「掘金日新计划 · 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练习生》