首页 > 其他分享 >放弃使用UUID,ULID才是更好的选择!

放弃使用UUID,ULID才是更好的选择!

时间:2024-09-05 12:54:49浏览次数:5  
标签:随机数 UUID ULID 毫秒 顺序 版本 放弃

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

# 1. 为什么不选择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 更加友好。

# 2. ULID特性

  • 与UUID的128位兼容性

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

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

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

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

  • 不区分大小写

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

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

# 3. ULID规范

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

 3.1 组成

时间戳

  • 48位整数

  • UNIX时间(以毫秒为单位)

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

随机性

  • 80位随机数

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

排序

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

编码方式

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

二进制布局和字节顺序

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

 3.2 应用场景

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

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

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

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

# 4. 用法(python)

安装

创建一个全新的ULID。

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

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

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

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

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

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

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

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

标签:随机数,UUID,ULID,毫秒,顺序,版本,放弃
From: https://blog.csdn.net/weixin_53707653/article/details/141862049

相关文章

  • UUIDV7: 我就是要用UUID做主键
    一直以来的互联网谣言:UUID是不适合用作数据库主键的.为什么?因为UUID是全随机的,对于数据库的索引不友好,插入时可能导致大量的索引树的分支合并.UUID根据RFC4122的描述,UUID被设计用于去中心化的ID生成格式128bit,16个字节,示例:f81d4fae-7dec-11d0-a765-00a0c91e6......
  • UUIDV7: 我就是要用UUID做主键
    一直以来的互联网谣言:UUID是不适合用作数据库主键的.为什么?因为UUID是全随机的,对于数据库的索引不友好,插入时可能导致大量的索引树的分支合并.UUID根据RFC4122的描述,UUID被设计用于去中心化的ID生成格式128bit,16个字节,示例:f81d4fae-7dec-11d0-a765-00a0c91e6......
  • PyTorch从入门到放弃之张量模块
    目录张量的数据类型torch.rand()函数torch.randn()函数torch.normal()函数torch.linspace()函数torch.manual_seed()函数torch.ones()、torch.zeros()、torch.eye()张量的基本操作增加和删除维度交换维度拼接和分割堆叠和分解索引和切片基本数学运算元素求和按索引求和元素乘积求......
  • 雪花算法和UUID
    雪花算法和UUIDUUIDUUID是一种唯一且不需要中央协调的ID,它使用某种规则创建ID,而不是某种中心化的自增方式,使得其成为创建成本最低的ID类型。到目前为止UUID一共有5个实现版本版本1:按照UUID定义的每个字段的意义来实现,使用的变量因子是时间戳+时钟序列+节点信息(Mac地址),考的......
  • java.util.UUID
    概述Aclassthatrepresentsanimmutableuniversallyuniqueidentifier(UUID).一个不可变的通用的唯一标识符的classAUUIDrepresentsa128-bitvalue.一个uuid代表一个128位的值 UUID的版本UUID有多个版本,每个版本有不同的生成方式。常用的......
  • Android开发 - UUID 类通用唯一标识符解析
    什么是UUIDUUID类是一个非常有用的工具,用来生成和处理通用唯一标识符(UUID)。UUID是一种标准的标识符,用于在计算机系统中唯一标识信息(UniversallyUniqueIdentifier)的缩写。它的目的是确保在不同的系统、不同的时间和地点生成的标识符是唯一的。UUID通常用于数据库记录、会话......
  • 放弃fastjson拥抱jackson
    放弃fastjson拥抱jackson背景功能强大好用;不亏是国人更懂国人;但是安全漏洞频发;生产项目总是告警勒令修改放弃使用。坑爹玩意fastjson漏洞太多直接搞了fastjson2;虽然大部分兼容远古项目还需要升级谁敢动呀。动了引发一些未知BUG那岂不是背锅侠(玩笑该干还得干挣得就是......
  • Scikit-learn从入门到放弃
    目录Scikit-learn简介SVM分类随机森林回归K-means聚类前置建议阅读:1、NumPy从入门到放弃2、Pandas从入门到放弃3、SciPy从入门到放弃Scikit-learn简介Sklearn:官方文档https://scikitlearn.com.cn/0.21.3/Scikit-learn(也称sklearn)是基于Python编程语言的机器学习工具,是......
  • @clickhouse/client-web部署后出现ClickHose query error:crypto.randomUUID is not a
    crypto.randomUUID报错我这里是因为使用使用@clickhouse/client-web组件,在服务器部署后在浏览器访问界面导致的crypto.randomUUIDisnotafunction报错如果你用http://localhost:端口,在服务器浏览器上访问这个部署的页面,发现不会报错,这是因为,你使用localhost访问......
  • 【Python】入门到放弃之第八章《元组》
    上一篇:【Python】入门到放弃之第七章《列表》下一篇:【Python】入门到放弃之第九章《字典》文章目录前言一、定义二、创建1.基本创建2.转换创建三、访问元素四、不可变性五、应用场景总结前言这是本系列的第八章节内容,《元组》。一、定义元组(Tuple)是Python中的......