ULID,一个比 UUID 更好用的方案

【Python】uuid 模块 从零开始,我们首先要理解UUID诞生的根本原因。在计算机科学早期,系统内的实体标识通常依赖于集中式的序列生成器。例如,数据库的主键常常是自增整数。这种模式在单体应用或单一数据库实例中表现良好。然而,随着互联网的爆炸式增长和分布式系统的兴起,传统ID生成方式面临了严峻挑战:UUID的出现,正是为了应对这些挑战。它通过结合时间戳、机器MAC地址、随机数和序列号等多种信息,以算法方式在本地生成,从而在极大概率上保证全球范围内的唯一性。其128位的长度提供了极其庞大的标识空间,使得随机碰撞的概率变得微乎其微。一个U 阅读详情

你好,我是坚持分享干货的 EarlGrey,翻译出版过《Python编程无师自通》、《Python并行计算手册》等技术书籍。

如果我的分享对你有帮助,请关注我,一起向上进击。

9249285103a53fc6e7a659ee0b3673e9.jpeg

来源:Python 编程时光

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特性

ulid() # 01ARZ3NDEKTSV4RRFFQ69G5FAV
  • 与 UUID 的 128 位兼容性

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

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

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

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

  • 不区分大小写

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

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

# 3. ULID 规范

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

01AN4Z07BY      79KA1307SR9X4MV3

|----------|    |----------------|
 Timestamp          Randomness
  10chars            16chars
   48bits             80bits

 3.1 组成

时间戳

  • 48 位整数

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

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

随机性

  • 80 位随机数

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

排序

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

编码方式

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

0123456789ABCDEFGHJKMNPQRSTVWXYZ

二进制布局和字节顺序

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

0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      32_bit_uint_time_high                    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     16_bit_uint_time_low      |       16_bit_uint_random      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                       32_bit_uint_random                      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                       32_bit_uint_random                      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

 3.2 应用场景

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

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

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

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

# 4. 用法(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')>

- EOF -

文章已经看到这了,别忘了在右下角点个“赞”和“在看”鼓励哦~

推荐阅读  点击标题可跳转

1、Python 项目工程化最佳实践

2、Python 可以比 C 还要快!

3、streamlit,一个超强的 Python 库

4、豆瓣8.9分的C++经典之作,免费送!

5、Python 3.12 版本有什么变化?

回复下方「关键词」,获取优质资源

回复关键词「 pybook03」,领取进击的Grey与小伙伴一起翻译的《Think Python 2e》电子版

回复关键词「书单02」,领取进击的Grey整理的 10 本 Python 入门书的电子版

👇关注我的公众号👇

告诉你更多细节干货

6d875c562e4172fc5de67932de6cfee6.jpeg

欢迎围观我的朋友圈

👆每天更新所想所悟

Postgres 数据库中 ULID 和 UUID 的性能 在本文中,我想分享我对经常用作标识符的数据类型的知识和看法。今天我们将同时讨论两个主题。这些是数据库端按键和键的数据类型衡量的搜索速度。 我将使用PostgreSQL数据库和演示Java服务来比较查询速度。 阅读详情

相关推荐

ulid:Python 3中的通用唯一词典可排序标识符(ULID)

乌里德 。 地位 该项目正在积极维护中。 安装 要从安装ulid: $ pip install ulid-py 要从源代码安装ulid: $ git clone git@github.com:ahawker/ulid.git $ cd ulid && python setup.py install 用法 创建一个全新的ULID。 时间戳记值(48位)来自 ,精度为毫秒。 随机值(80位)来自os.urandom() 。 >> > import ulid >> > ulid . new () < ULID> 根据现有的128位值(例如UUID)创建新的ULID。 支持ULID值,如int , bytes , str和UUID类型。 >> > import ulid , uuid

php、java、python、js如何生成使用ULID

【代码】php、java、python、js如何生成使用ULID。

技术应让更广泛的人群流入到实际产品开发中才是正统 967

Android Studio安装常见问题详解——Android Emulator Hypervisor Driver for AMD Processors installation failed.

目录一、问题描述二、解决方案2.1 开启CPU虚拟化2.2 禁用Hyper-V2.3 使用管理员命令行在驱动程序包中执行“silent_install.bat” 一、问题描述 新买的AMD轻薄本,在安装Android Studio时遇到问题: Android Emulator Hypervisor Driver for AMD Processors installation failed. 笔记本配置为: 二、解决方案 2.1 开启CPU虚拟化 设置虚拟化的步骤这里不进行详细介绍了。如果需要,可以自行百

Wendy的博客 4万+

Python:ULID通用唯一词典排序标识符

译文: Python 3中的通用唯一词典排序标识符(ULID)

彭世瑜的博客 1394

Fast-LIO2代码解析 古月居

FAST-LIO,FAST-LIO2与FASTER-LIO - 古月居FAST-LIO2代码解析(一) - 古月居FAST-LIO2代码解析(二) - 古月居FAST-LIO2代码解析(三) - 古月居FAST-LIO2代码解析(四) - 古月居FAST-LIO2代码解析(五) - 古月居FAST-LIO2代码解析(六) - 古月居

li4692625的博客 2795

Ubuntu双系统引导修复实战:boot-repair工具详解

本文详细介绍了使用boot-repair工具修复Ubuntu双系统引导丢失问题的实战方法。当GRUB引导菜单因安装新系统或更新而损坏时,通过制作Ubuntu启动盘进入Live环境,安装并运行boot-repair,可一键完成系统修复引导,自动化执行GRUB重装与配置,解决无法进入Windows或Ubuntu的常见故障。

weixin_29224589的博客 359

Python-ULID 项目教程

Python-ULID 项目教程 1. 项目的目录结构及介绍 python-ulid/ ├── docs/ │ └── ... # 文档文件 ├── tests/ │ └── ... # 测试文件 ├── ulid/ │ └── ... # 核心代码文件 ├── .gitignore ├── LICENSE ├── Pipfile ...

gitblog_01064的博客 569

【图文步骤】EC-Engineer部分操作详细步骤

EC-Engineer部分功能详细使用手册

weixin_42212468的博客 6174

ULID - 一种比UUID更好的方案

为什么不选择UUID 在分布式场景下,很多人选择了 UUID 作为 ID ,UUID 目前有 5 个版本,分别是: 版本1:依赖于时间戳和 MAC 地址,容易被攻击; 版本2:将版本 1 的时间戳前四位换为 POSIX 的 UID 或 GID,问题同上; 版本3:基于 MD5 哈希算法生成,生成随机分布的ID需要唯一的种子,这可能导致许多数据结构碎片化; 版本4:基于随机数或伪随机数生成,除了随机性外没有提供其他信息; 版本5:通过 SHA-1 哈希算法生成,生成随机分布的ID需要唯一的种子,这可能导致许多

pushiqiang的博客 8005

电脑主板开机12步流程全解析:从按下电源键到BIOS启动的完整过程

本文深入解析了电脑主板从按下电源键到BIOS启动的完整12步流程,详细阐述了待机电路、主供电上电、CPU供电建立、时钟信号分发及复位链等关键硬件协同工作原理。通过剖析电脑主板的电路结构与芯片协作时序,帮助读者构建系统性的硬件故障诊断思维,精准定位开机故障。

weixin_29290963的博客 269

win2012没有远程桌面授权服务器可以提供许可证 如何远程

如果远程windows服务器时,提示“没有远程桌面授权服务器可以提供许可证 如何远程”,先通过以下方式进行强制登录,然后在对服务器进行设置即可,延期使用。 强制登录服务器方式; 1、运行—输入:mstsc /admin /v ip:端口 回车即可 2、进入远程桌面,输入 ip:端口 /admin 例如:mstsc /admin /v 192.168.0.131:23568 进入服务器以后,按照以下步骤进行设置即可: ...

蜗牛快爬 1万+

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

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

weixin_53707653的博客 1065

Camunda 7.x 系列【22】全局监听器

Camunda支持义一个全局ExecutionListener和一个全局TaskListener,会捕获流程中发生的所有事件的通知,这样可以定义一个全局的审批人检查监听器,作用于所有用户任务。

记录知识、锤炼自我 2942

告别UUID,拥抱ULID:更卓越的全局唯一标识符解决方案

ULID(Universally Unique Lexicographically Sortable Identifier)是一种新型的唯一标识符,由Alizain Feerasta在2016年提出。不同于传统的UUID,ULID设计时考虑了排序的需求。具体来说,一个ULID通常由26个字符组成,这些字符分为两部分:时间戳信息和随机序列。这样的结构不仅保证了标识符的全局唯一性,还赋予了它们天然的可排序属性。这意味着在需要按时间顺序组织数据的场景下,如日志文件或数据库记录,使用ULID可以带来额外的便利。

m0_56416159的博客 3087

【银河麒麟V10】【桌面】【服务器】系统启动问题

1、如果之前运行好好的,重启后系统报错,一般80%是因为fstab的问题,回想下之前有没有添加过外接存储,修改过/etc/fstab,如果是的话一般是因为存储异常(比如网络存储无法连接,本地存储路径变化)导致系统开机自检失败,导致无法正常启动; 处理方式:进入单用户(单用户进入的几种方式上面有专门文章介绍),修改/etc/fstab,将新增的内容暂时注释掉,然后重启系统,能正常进入系统后再分析失败原因。 ...

桂安俊@KylinOS 3万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

使用ULID而不是UUID

ULID(Universally Unique Lexicographically Sortable Identifier)是一种新型的唯一标识符,由Alizain Feerasta在2016年提出。不同于传统的UUID,ULID设计时考虑了排序的需求。具体来说,一个ULID通常由26个字符组成,这些字符分为两部分:时间戳信息和随机序列。这样的结构不仅保证了标识符的全局唯一性,还赋予了它们天然的可排序属性。

★【World Of Moshow 郑锴】★ 1557

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

ULID 一种比UUID更好的方案

ULID 一种比UUID更好的方案

hjxisking的专栏 383

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

ULID:一种比UUID更好的替代方案

点击关注公众号,实用技术文章及时了解ULID:Universally Unique Lexicographically Sortable Identifier(通用唯一词典分类标识符)UUID:Universally Unique Identifier(通用唯一标识符)为什么不选择UUIDUUID 目前有 5 个版本:版本1:在许多环境中是不切实际的,因为它需要访问唯一的,稳定的MAC地址,容易被...

Java知音 626

再见了,UUID ULID更香

支持时间戳值类型有int,float,str,bytes,bytearray,memoryview,datetime,Timestamp,和ULID。和 UUID 要么基于随机数,要么基于时间戳不同,ULID 是既基于时间戳又基于随机数,时间戳精确到毫秒,毫秒内有1.21e + 24个随机数,不存在冲突的风险,而且转换成字符串比 UUID 更加友好。支持随机值类型有int,float,str,bytes,bytearray,memoryview,Randomness,和ULID。

系统看你学习很认真,随机送了一个月会员! 1139
上一篇: PyTorch 2.2 大更新,性能提升 2 倍!
下一篇: Python 爬虫高手必备的 8 大技巧!
codingpy
博客等级 码龄11年 1873粉丝 104原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值