架构师大咖
架构师大咖,打造有价值的架构师交流平台。分享架构师干货、教程、课程、资讯。架构师大咖,每日推送。
公众号
该公众号已被封禁
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(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')>
Python入门到精通
Python入门到精通:人生苦短,我用Python!Python每日推送、Python教程、Python资料、Python视频、Python项目、Python学习等。
公众号
该公众号已被封禁
本文转自 https://mp.weixin.qq.com/s/GVuCQ0a0LX2JcBtVT5sFFQ,如有侵权,请联系删除。对于从来没有接触过编程的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。
👉Python学习大纲👈
Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
点击下方安全链接前往获取
👉Python实战案例👈
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
👉Python书籍和视频合集👈
观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
👉Python副业创收路线👈
这些资料都是非常不错的,朋友们如果有需要《Python学习路线&学习资料》,点击下方安全链接前往获取