当前位置: 首页 > news >正文

ULID和UUID

ULID:Universally Unique Lexicographically Sortable Identifier(通用唯一词典分类标识符)UUID:Universally Unique Identifier(通用唯一标识符)

为什么不选择UUID

UUID 目前有 5 个版本:

  • 版本1:在许多环境中是不切实际的,因为它需要访问唯一的,稳定的MAC地址,容易被攻击;

  • 版本2:将版本 1 的时间戳前四位换为 POSIX 的 UID 或 GID,问题同上;

  • 版本3:基于 MD5 哈希算法生成,生成随机分布的ID需要唯一的种子,这可能导致许多数据结构碎片化;

  • 版本4:基于随机数或伪随机数生成,除了随机性外没有提供其他信息;

  • 版本5:通过 SHA-1 哈希算法生成,生成随机分布的ID需要唯一的种子,这可能导致许多数据结构碎片化;

这里面常用的就是 UUID4 了,但是,即使是随机的,但是也是存在冲突的风险。和 UUID 要么基于随机数,要么基于时间戳不同,ULID 是既基于时间戳又基于随机数,时间戳精确到毫秒,毫秒内有1.21e + 24个随机数,不存在冲突的风险,而且转换成字符串比 UUID 更加友好。

ULID特性

ulid() # 01ARZ3NDEKTSV4RRFFQ69G5FAV

与UUID的128位兼容性

每毫秒1.21e + 24个唯一ULID

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

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

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

不区分大小写

没有特殊字符(URL安全)

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

ULID规范

以下是在python(ulid-py)中实现的ULID的当前规范。二进制格式已实现

01AN4Z07BY79KA1307SR9X4MV3|----------||----------------|TimestampRandomness10chars16chars48bits80bits

组成

时间戳

48位整数

UNIX时间(以毫秒为单位)

直到公元10889年,空间都不会耗尽。

随机性

80位随机数

如果可能的话,采用加密技术保证随机性

排序

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

编码方式

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

0123456789ABCDEFGHJKMNPQRSTVWXYZ

二进制布局和字节顺序

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

012301234567890123456789012345678901+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+|32_bit_uint_time_high|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     16_bit_uint_time_low      |       16_bit_uint_random      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                       32_bit_uint_random                      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                       32_bit_uint_random                      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

应用场景

替换数据库自增id,无需DB参与主键生成

分布式环境下,替换UUID,全局唯一且毫秒精度有序

比如要按日期对数据库进行分区分表,可以使用ULID中嵌入的时间戳来选择正确的分区分表

如果毫秒精度是可以接受的(毫秒内无序),可以按照ULID排序,而不是单独的created_at字段

用法(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();
// 单调排序
Ulid ulid = UlidCreator.getMonotonicUlid();

用法(python)

安装

pip install ulid-py

创建一个全新的ULID。

时间戳记值(48位)来自 time.time(),精度为毫秒。

随机值(80位)来自 os.urandom()。

>>> import ulid
>>> ulid.new()
<ULID('01BJQE4QTHMFP0S5J153XCFSP9')>

根据现有的128位值(例如UUID)创建新的ULID 。支持ULID值类型有 int,bytes,str,和UUID。

>>> import ulid, uuid
>>> value = uuid.uuid4()
>>> value
UUID('0983d0a2-ff15-4d83-8f37-7dd945b5aa39')
>>> ulid.from_uuid(value)
<ULID('09GF8A5ZRN9P1RYDVXV52VBAHS')>

从现有时间戳值(例如datetime对象)创建新的ULID 。支持时间戳值类型有int,float,str,bytes,bytearray,memoryview,datetime,Timestamp,和ULID

>>> import datetime, ulid
>>> ulid.from_timestamp(datetime.datetime(1999, 1, 1))
<ULID('00TM9HX0008S220A3PWSFVNFEH')>

根据现有的随机数创建一个新的ULID。

支持随机值类型有int,float,str,bytes,bytearray,memoryview,Randomness,和ULID。

>>> import os, ulid
>>> randomness = os.urandom(10)
>>> ulid.from_randomness(randomness)
>>> <ULID('01BJQHX2XEDK0VN0GMYWT9JN8S')>

一旦有了ULID对象,就有多种与之交互的方法。

timestamp()方法将为您提供ULID的前48位的时间戳快照,而randomness()方法将为您提供后80位的随机数快照。

>>> import ulid
>>> u = ulid.new()
>>> u
<ULID('01BJQM7SC7D5VVTG3J68ABFQ3N')>
>>> u.timestamp()
<Timestamp('01BJQM7SC7')>
>>> u.randomness()
<Randomness('D5VVTG3J68ABFQ3N')>

http://www.lryc.cn/news/29049.html

相关文章:

  • java基础面试10题
  • Golang闭包问题及并发闭包问题
  • 基频的后处理
  • vue3 toRefs详解
  • Spring——AOP是什么?如何使用?
  • 【微服务】认识微服务
  • 【独家】华为OD机试 C 语言解题 - 最长连续子串
  • 【Linux】CentOS7操作系统安装nginx实战(多种方法,超详细)
  • 【FMCW 01】中频IF信号
  • 【蓝桥杯试题】暴力枚举题型
  • I.MX6ULL_Linux_系统篇(22) kernel移植
  • UE实现相机聚焦物体功能
  • 算法系列之数值积分的目的
  • 【2.4 golang中循环语句for】
  • 代码随想录 动态规划||343 96
  • Python---正则表达式
  • Unity入门精要02---纹理
  • 【Day1】一小时入门 python 基础,从安装到入门
  • 2D图像处理:相机标定
  • windows 下 python 和repo 下载安装环境变量配置
  • jsp进阶
  • 模块化CommonJS、AMD、CMD、ES6
  • Python GUI界面编程-初识
  • 【Servlet篇4】cookie和session
  • 考研流程,可以进来转一转(考研你不知道的事情)(详细版)
  • 3.2 LED闪烁流水灯蜂鸣器
  • 刷题笔记3 | 203. 移除链表元素、707设计链表,206.反转链表
  • [一篇读懂]C语言十一讲:单链表的删除和单链表真题实战
  • 【C++初阶】list的使用
  • HTML 布局