网易首页 > 网易号 > 正文 申请入驻

再见,UUID!

0
分享至

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安全)

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

  • 面试宝典:https://www.yoodb.com/

ULID规范

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

01AN4Z07BY 79KA1307SR9X4MV3

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

时间戳

  • 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 |
应用场景

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

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

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

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

用法(python)

安装

pip install ulid-py

创建一个全新的ULID。

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

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

>>> import ulid
>>> ulid.new()
'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)
'09GF8A5ZRN9P1RYDVXV52VBAHS')>

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

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

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

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

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

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

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

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

github:https://github.com/ahawker/ulid

作者:pushiqiang https://blog.csdn.net/pushiqiang/article/details/117365290

公众号“Java精选”所发表内容注明来源的,版权归原出处所有(无法查证版权的或者未注明出处的均来自网络,系转载,转载的目的在于传递更多信息,版权属于原作者。如有侵权,请联系,笔者会第一时间删除处理!

最近有很多人问,有没有读者交流群!加入方式很简单,公众号Java精选,回复“加群”,即可入群!

(微信小程序):3000+道面试题,包含Java基础、并发、JVM、线程、MQ系列、Redis、Spring系列、Elasticsearch、Docker、K8s、Flink、Spark、架构设计等,在线随时刷题!

特别推荐:专注分享最前沿的技术与资讯,为弯道超车做好准备及各种开源项目与高效率软件的公众号,「大咖笔记」,专注挖掘好东西,非常值得大家关注。点击下方公众号卡片关注

文章有帮助的话,点在看,转发吧!

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
巴萨官宣今夏首援 25岁英格兰国脚8000万欧加盟 签约5年+薪水翻倍

巴萨官宣今夏首援 25岁英格兰国脚8000万欧加盟 签约5年+薪水翻倍

我爱英超
2026-05-30 05:17:32
唐嫣携女参加幼儿园活动,背280万包成全场焦点

唐嫣携女参加幼儿园活动,背280万包成全场焦点

勇敢的人享受生活
2026-05-30 01:44:10
西红柿的最佳搭配不是鸡蛋,而是它!夏天吃护血管,远离便秘

西红柿的最佳搭配不是鸡蛋,而是它!夏天吃护血管,远离便秘

芹姐说生活
2026-05-28 15:08:48
女子凌晨车上排泄后续!平台公布叫车信息,网友:该承担应有责任

女子凌晨车上排泄后续!平台公布叫车信息,网友:该承担应有责任

小虎新车推荐员
2026-05-30 02:07:59
舒淇早期拍摄写真时的留影,慵懒风情,自成风月

舒淇早期拍摄写真时的留影,慵懒风情,自成风月

娱你同欢
2026-05-01 21:31:11
在外面千万不要同情心泛滥 网友:卖剩的凉菜倒掉也不能随便送人

在外面千万不要同情心泛滥 网友:卖剩的凉菜倒掉也不能随便送人

夜深爱杂谈
2026-05-25 19:37:47
谢苗感谢周润发,当年劝自己回去上学,网友:不听他的你现在更红

谢苗感谢周润发,当年劝自己回去上学,网友:不听他的你现在更红

阿晭评论哥
2026-05-29 10:27:25
神经内科医生提醒:这几种不舒服其实是脑梗,千万别大意,速看!

神经内科医生提醒:这几种不舒服其实是脑梗,千万别大意,速看!

医路平安
2026-05-28 18:33:16
广州市市长孙志洋:2030年广州GDP将达4.5万亿元,2035年达到6万亿元

广州市市长孙志洋:2030年广州GDP将达4.5万亿元,2035年达到6万亿元

证券时报
2026-05-29 16:42:04
媒体人评武磊重返国足:纯粹是凑100场 估计今年退役 状态只剩20%

媒体人评武磊重返国足:纯粹是凑100场 估计今年退役 状态只剩20%

风过乡
2026-05-29 12:37:36
10亿都救不了一命!京东副总裁蔡磊,生命进入倒计时

10亿都救不了一命!京东副总裁蔡磊,生命进入倒计时

听风喃
2026-04-06 11:16:04
屋漏偏逢连夜雨!60岁郭富城再迎噩耗,方媛疑产后抑郁是冰山一角

屋漏偏逢连夜雨!60岁郭富城再迎噩耗,方媛疑产后抑郁是冰山一角

悄悄史话
2026-05-28 11:44:23
为什么今年没人提“消费降级”了?

为什么今年没人提“消费降级”了?

黯泉
2026-05-20 17:47:21
比赖清德还狂!若2028年她当台湾地区领导人,解放军出手武力统台

比赖清德还狂!若2028年她当台湾地区领导人,解放军出手武力统台

阿讯说天下
2026-05-26 13:40:22
新赛季将扣近120万英镑积分!准神世界第一难保,赵心童有望登顶

新赛季将扣近120万英镑积分!准神世界第一难保,赵心童有望登顶

世界体坛观察家
2026-05-29 17:29:12
南京军人俱乐部将打造成为城市新地标

南京军人俱乐部将打造成为城市新地标

金台资讯
2026-05-29 07:19:02
景甜恐怕是遇到杀猪盘了!想和解得掏2亿。

景甜恐怕是遇到杀猪盘了!想和解得掏2亿。

草莓解说体育
2026-05-30 06:22:14
第三方帮银行拉客?宣传“存1万返100还报销路费” 涉事银行工作人员否认合作

第三方帮银行拉客?宣传“存1万返100还报销路费” 涉事银行工作人员否认合作

红星资本局
2026-05-29 19:40:08
刚被裁就有退路?专家:太阳队还有后手签回范·利斯

刚被裁就有退路?专家:太阳队还有后手签回范·利斯

甜份超标的我
2026-05-30 02:04:58
性生活史被医生写在健康证上,女生急了:我至今还没交过男友

性生活史被医生写在健康证上,女生急了:我至今还没交过男友

映射生活的身影
2026-05-29 20:32:03
2026-05-30 07:24:49
Java精选
Java精选
一场永远也演不完的戏
1791文章数 3859关注度
往期回顾 全部

科技要闻

Claude Opus 4.8凌晨突发上线

头条要闻

释永信被判24年 中国佛教协会:完全是咎由自取

头条要闻

释永信被判24年 中国佛教协会:完全是咎由自取

体育要闻

即使是文班亚马,也做不到这件事

娱乐要闻

奚梦瑶何猷君将于6月在法国举行婚礼

财经要闻

近3个月跌超20% 黄金"猴市"下的众生相

汽车要闻

900V+3.2秒破百 领克10+&领克10上市16.99万元起

态度原创

艺术
健康
教育
手机
军事航空

艺术要闻

粉墙黛瓦别样美

尝试干细胞疗法如何避免踩坑?

教育要闻

动点定值问题,一个视频学会!

手机要闻

连续7个季度超越iOS!鸿蒙份额飙升,安卓却全球失守了!

军事要闻

中方公布参加香会阵容 几大议题受到关注

无障碍浏览 进入关怀版