Redian新闻
>
放弃使用UUID,ULID才是更好的选择!

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

公众号新闻

作者:pushiqiang

blog.csdn.net/pushiqiang/article/details/117365290

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的当前规范。二进制格式已实现

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()
<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(199911))
<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')>

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

推荐阅读  点击标题可跳转

1、什么是国密算法?

2、Linux内核PCIE

3、图解 IPSec

微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
想给你最好的,却发现你才是最好的 | 年度最值得入手的圣诞新年礼物留港新选择!中国建设银行罕!见!捞!人!最新!2024年考研人数即将超500万!转战海外读研成主流学生选择!留学生涂鸦竟成“恐怖主义”?希望法国作出正确选择!米其林餐厅钟爱!送礼好选择!一口入魂的【法国佳利龙船红酒】,喝一次就会爱上!一条命令生成属于自己的工具站(json格式化、编码转换、UUID生成等)注意!加拿大全国热销巧克力紧急召回!送礼热门选择!美本录取捷报 | USC+1,UMichigan+1,UIUC+1,UBC+1等多校发来喜报!恭喜丽格学子!探索美国最佳家庭旅行圣地,共有21个亲子游的理想选择!大的要来了:谷歌Bard被曝将更名为Gemini,Ultra 1.0更强但收费、安卓App也会来比橙子更好剥、比橘子更好吃!中国沃柑看广西,广西沃柑看武鸣!我知道你想用useEffect,但你先别急6050 血壮山河 卢沟桥之变 19公立常青藤EA齐放榜,UNC破百,UMich超上年!中国学生受青睐...像王思聪一样不承父业,才是二代们最好的选择这篇文章,解决你的选择困难症德州磁场不减,U-Haul数据揭示2023年最热门搬家去处捡漏!59元3条!!!一裤多穿,鲨鱼裤才是正确选择!台湾选举!和平 vs 冲突:历史之选择!什么才是“更好的死亡”?(连岳注:衰老、养老、老年医疗,打破了许多偏见,值得一读)精神状态,挺好的呀挺好的呀挺好的呀挺好的呀挺好的呀挺好的呀挺好的呀挺好的呀挺好的呀挺好的呀挺好的呀挺好的呀挺好的呀挺好的呀挺好的愁人,让我苦思冥想的一个问题“在历史关头,我们共同作出了正确的选择”喜茶联名繁花;蜜雪冰城回应放弃瓶装水业务;lululemon任命新任全球创意总监... | 刀法品牌热讯为什么大家还在用USB2.0?莫大、马林斯基两大俄国院团古典影像周五连映,Uliana Lopatkina与Z娃各美其美红色日记 痛悼诗 1.13-20一年一度的审计完美收官5099元,机械革命·无界14Pro,ULTRA5-125H留学丨如果你有艺术梦想和追求,这里将是很好的选择加拿大移民新选择!深度解读阿省雇主担保AAIP项目当小人物取代大故事,电影里的现实主义是更多还是更少? | 编辑部聊天室《写故事的人》&《可否许我再少年》高镍单晶层状正极是未来的高能量密度锂电的选择吗?太炸裂!澳洲华人看中国大片新选择!2023最好看电影全有!高清无广,0费用!这个煲剧平台太6了…
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。