0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

为什么不选择UUID?UUID有哪些特性

jf_ro2CN3Fa 来源:CSDN 作者:pushiqiang 2022-10-13 10:29 次阅读

为什么不选择UUID

ULID特性:

ULID规范

组成

应用场景

用法(python

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 更加友好。

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

ULID特性:

ulid()#01ARZ3NDEKTSV4RRFFQ69G5FAV

与UUID的128位兼容性

每毫秒1.21e + 24个唯一ULID

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

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

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

不区分大小写

没有特殊字符(URL安全)

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

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

ULID规范

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

01AN4Z07BY79KA1307SR9X4MV3

|----------||----------------|
TimestampRandomness
10chars16chars
48bits80bits

组成

时间戳

48位整数

UNIX时间(以毫秒为单位)

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

随机性

80位随机数

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

排序

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

编码方式

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

0123456789ABCDEFGHJKMNPQRSTVWXYZ

二进制布局和字节顺序

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

0123
01234567890123456789012345678901
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|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)

安装

pipinstallulid-py

创建一个全新的ULID。

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

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

>>>importulid
>>>ulid.new()

根据现有的128位值(例如UUID)创建新的ULID 。

支持ULID值类型有 int,bytes,str,和UUID。

>>>importulid,uuid
>>>value=uuid.uuid4()
>>>value
UUID('0983d0a2-ff15-4d83-8f37-7dd945b5aa39')
>>>ulid.from_uuid(value)

从现有时间戳值(例如datetime对象)创建新的ULID 。

支持时间戳值类型有int,float,str,bytes,bytearray,memoryview,datetime,Timestamp,和ULID

>>>importdatetime,ulid
>>>ulid.from_timestamp(datetime.datetime(1999,1,1))

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

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

>>>importos,ulid
>>>randomness=os.urandom(10)
>>>ulid.from_randomness(randomness)
>>>

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

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

>>>importulid
>>>u=ulid.new()
>>>u

>>>u.timestamp()

>>>u.randomness()



审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • URL
    URL
    +关注

    关注

    0

    文章

    139

    浏览量

    15307
  • python
    +关注

    关注

    55

    文章

    4777

    浏览量

    84421
  • UUID
    +关注

    关注

    0

    文章

    22

    浏览量

    8103

原文标题:ULID - 一种比UUID更好的方案

文章出处:【微信号:芋道源码,微信公众号:芋道源码】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    mysql为什么推荐使用uuid呢?使用uuid究竟有什么坏处?

    分别是user_auto_key,user_uuid,user_random_key,分别表示自动增长的主键,uuid作为主键,随机key作为主键,其它我们完全保持不变。
    的头像 发表于 12-22 13:52 2308次阅读
    mysql为什么<b class='flag-5'>不</b>推荐使用<b class='flag-5'>uuid</b>呢?使用<b class='flag-5'>uuid</b>究竟有什么坏处?

    关于蓝牙UUID

    蓝牙的各个服务的UUID怎么查询?像血压,血糖,心率等都有固定的UUID,测量体重(weight scale profile)的UUID是多少?
    发表于 08-20 18:12

    UUID类型怎么更改或添加

    你好,我在BLE组件和广告包中定义了我的服务的UUIDUUID类型是:128位服务类UUID(0x06)的不完整列表。需要更改或添加的是UDDE类型:128位服务类UUID(0x07
    发表于 10-17 16:19

    怎么访问自定义服务特征UUID

    柏树世界:自定义配置文件服务UUID可以在配置的BLE、配置文件选项卡、自定义服务窗口中查看,例如UUID:AAAAAAA-AAAAAAAAAAAA-AAAAAAAAAAAAA相关联的自定义服务特性
    发表于 09-19 07:56

    客户端UUID句柄多项选择

    柏树世界:我下面两个(2)个选择题:1。客户端UUID/句柄的选择题:以下哪一个将被用来获取连接客户端的服务特性
    发表于 09-19 08:17

    如何选择uuid以确保它与标准服务的现有uuid冲突?

    在CyPress DOC中,我看到:“BLE SIG建议使用128位UUID,与基础UUID不同,用于自定义属性,以确保它不与标准服务的现有UUID冲突。”如何选择StutuUID以确
    发表于 10-12 14:08

    请问CC2540 UUID之间什么区别?

    主设备扫描是通过UUID来确定设备数,这里的UUID和服务的UUID是什么关系?
    发表于 11-11 09:22

    请问UUID申明可以声明GATT_CHAR_USER_DESC_UUID吗?

    UUID申明可以声明GATT_CHAR_USER_DESC_UUID,和通知功能的UUID可以
    发表于 03-09 09:02

    Java的UUID生成工具并发测试

    UUID 维基百科,自由的百科全书 通用唯一识别码 (Universally Unique Identifier, UUID) 是一个软件建构的标准,亦为自由软件基金会 (Open Software Foundation, OSF) 的组织在分布式计
    发表于 11-10 17:00 29次下载

    如何获取APP及其动态库的UUID

    LC_UUID 一般简称为 UUID,是用来标示 Mach-O 文件的,做过崩溃堆栈符号化还原的同学应该都知道 UUID 这个东西,你在进行符号解析的时候,就需要找到与系统库和你 A
    发表于 09-25 09:25 1次下载

    关于蓝牙服务UUID自定义的简单介绍

    ,每一个蓝牙技术联盟定义的属性一个唯一的16位UUID,以代替上面的基本UUID的‘x’部分。使用16位的UUID便于记忆和操作,如SIG定义了“Device
    发表于 01-29 15:17 4881次阅读

    UUID正在被NanoID取代?

    对于 JavaScript,生成 UUID 或 NanoID 都非常简单。它们都有对应的 NPM 包来帮助我们实现生成。我们所需要做的就是运行 npm i nanoid 命令安装 NanoID NPM 库 并在我们的项目中使用它
    的头像 发表于 04-02 14:52 1292次阅读

    在mysql中设计表为什么建议采用uuid呢?

    user_auto_key,user_uuid,user_random_key,分别表示自动增长的主键,uuid 作为主键,随机 key 作为主键,其它我们完全保持不变。
    的头像 发表于 12-02 09:49 724次阅读

    Debug Core UUID mismatch案例总结

    Efinity在Debug时会出现UUID mismatch错误。很多刚开始使用的人经常遇到。下面我们做一个总结。欢迎遇到案例时共同分享。
    的头像 发表于 02-06 15:18 1863次阅读
    Debug Core <b class='flag-5'>UUID</b> mismatch案例总结

    Efinity在Debug时会出现UUID mismatch错误案例分享

    Efinity在Debug时会出现UUID mismatch错误。很多刚开始使用的人经常遇到。
    的头像 发表于 02-20 10:56 1762次阅读
    Efinity在Debug时会出现<b class='flag-5'>UUID</b> mismatch错误案例分享