视频加载失败

常用模块之uuid模块

1783 字
9 分钟
常用模块之uuid模块

【一】是什么UUID ?#

  • UUID 只是一个值,您可以放心地将其视为唯一值。
  • 碰撞的风险是如此之低,以至于您可以合理地选择完全忽略它。
  • 您可能会看到 UUID 使用不同的术语(GUID 或 Globally Unique Identifier,是 Microsoft 的首选语义)来引用,但含义和效果保持不变。
  • 真正的 UUID 是由标准化格式生成和表示的唯一标识符。
  • 有效的 UUID 由RFC 4122定义;本规范描述了可用于生成 UUID 的算法,这些算法在实现之间保持唯一性,而无需中央发行机构。

【二】UUID的五种算法#

【1】版本 1#

  • 基于时间– 结合时间戳、时钟序列和特定于生成设备的值(通常是其 MAC 地址),以在该时间点为该主机生成唯一的输出。

【2】版本2#

  • DCE 安全性
  • 此版本是作为第 1 版的演变而开发的,用于分布式计算环境 ( DCE )。它没有被广泛使用。

【3】版本 3#

  • 基于名称 (MD5) – MD5
  • 对“名称空间”和“名称”进行散列处理,以创建名称在名称空间内唯一的值。
  • 生成另一个具有相同命名空间和名称的 UUID
  • 将产生相同的输出,因此此方法提供可重现的结果。

【4】版本 4#

  • 随机- 大多数现代系统倾向于选择 UUID v4,因为它使用主机的随机或伪随机数源来发布其值。
  • 两次生成相同 UUID的机会几乎可以忽略不计。

【5】版本 5#

  • 基于名称 (SHA-1) - 这与版本 3 类似,但它使用更强大的 SHA-1 算法来散列输入命名空间和名称。
  • 尽管 RFC 将算法称为版本,但这并不意味着您应该始终使用版本 5,因为它似乎是最新的。
  • 选择哪一种取决于您的用例;在许多情况下,选择 v4 是因为它的随机性。
  • 这使它成为简单的“给我一个新标识符”场景的理想选择。

【三】UUID格式#

  • 生成算法发出一个 128 位无符号整数。
  • 但是,UUID 更常见的是十六进制字符串,也可以存储为 16 个字符的二进制序列。
  • 这是一个 UUID 字符串的示例:
16763be4-6022-406e-a950-fcd5018633ca
  • 该值表示为由短划线字符分隔的五组字母数字字符。
  • 破折号不是字符串的强制组成部分;它们的存在取决于 UUID 规范的历史细节。
  • 它们还使标识符更容易被人眼感知。

【四】Python中的UUID#

【1】概览#

(1)UUID概念#

  • UUID,即Universally Unique Identifier,是一种长度为128位的二进制数字标识符,其设计目标是确保在特定的时间和空间范围内具有全球唯一的标识能力。

(2)UUID的主要特性#

  • 全局唯一性:由于其生成算法结合了硬件信息(如MAC地址)、时间戳、随机数以及特定的命名空间信息等元素,理论上几乎不可能产生相同的UUID。
  • 标准化格式:通常以32个十六进制数(0-9,A-F)的形式表示,并通过连字符“-”分为五组,即xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx。这种标准格式便于人眼识别与解析。
  • 应用广泛:在分布式系统、数据库管理、软件开发、网络协议、物联网等领域广泛应用,作为跨系统、跨平台唯一标识各类资源的有效手段。

【2】Python中的uuid模块#

  • Python的uuid模块提供了生成、解析、比较、操作UUID的一整套工具,极大地简化了在Python程序中使用UUID的过程。

(1)UUID生成方式#

a. uuid1()#

  • 基于时间戳和MAC地址:
  • uuid1()函数生成的UUID包含节点ID(通常为MAC地址)、时钟序列和时间戳。
  • 这种类型的UUID在全局范围内的唯一性较高,但依赖于本地硬件信息,且可能暴露部分设备信息。

b. uuid3()#

  • 基于名字的MD5散列值:
  • uuid3()函数接收一个名称(通常是字符串)和一个命名空间UUID作为参数,然后使用MD5算法计算出散列值来生成UUID。
  • 这种方式产生的UUID在同一命名空间内是唯一的,适用于需要在特定上下文中创建唯一标识的情况。

c. uuid4()#

  • 随机生成:
  • uuid4()函数完全依赖于随机数生成器,产生的UUID具有最高的不确定性,因此在全局范围内的唯一性极强,适用于对隐私保护有较高要求或无需关联特定上下文的场景。

d. uuid5()#

  • 基于名字的SHA-1散列值:
  • uuid5()函数与uuid3()类似,同样接收一个名称和一个命名空间UUID作为参数,但使用更安全的SHA-1算法计算散列值。
  • 这种UUID在相同命名空间和名称下保持唯一,适用于需要更强安全性和唯一性的应用场景。

(2)UUID对象属性与方法#

  • hex:返回UUID的完整十六进制字符串表示,不含连字符。
  • int:返回UUID的整数表示。
  • urn:返回符合URN(Uniform Resource Name)规范的UUID字符串。
  • bytes:返回UUID的原始二进制表示(16字节)。
  • fields:返回一个元组,包含时间低位(time_low)、时间中间(time_mid)、时间高位(time_hi_version)、时钟序列(clock_seq_hi_variant、clock_seq_low)和节点(node)五个部分的值。
  • time_low, time_mid, time_hi_version, clock_seq_hi_variant, clock_seq_low, node:分别访问UUID各组成部分的值。

(3)UUID解析与转换#

  • uuid.UUID():接受一个有效的UUID字符串(含或不含连字符)或字节串作为参数,将其解析为UUID对象。
  • uuid.Bytes_From_UUID():已弃用,使用uuid.uuid_to_bytes()代替,将UUID对象转换为字节串。

(4)UUID比较、排序与哈希#

  • uuid.uuid1_compare():比较两个uuid1()生成的UUID的时序关系。
  • uuid.uuid1_sorted():返回一个可迭代对象,其中包含了按时间顺序排列的uuid1()生成的UUID列表。
  • uuid.uuid_hash():返回一个可用于哈希表和集合操作的整数值,基于UUID的内容进行计算。

【3】示例#

import uuid
# uuid1 : 该方法生成一个基于主机的MAC地址和当前时间戳的UUID。
uuid1 = uuid.uuid1()
print(uuid1)
# af80b342-ff0d-11ee-ab33-0aeb02d737e9
# uuid3 : 该方法生成一个基于名字的MD5散列值的UUID。
uuid3 = uuid.uuid3(uuid.NAMESPACE_DNS, 'python.org')
print(uuid3)
# 6fa459ea-ee8a-3ca4-894e-db77e160355e
# uuid4 : 该方法生成一个随机UUID。
uuid4 = uuid.uuid4()
print(uuid4)
# 41d097ec-551d-48e1-a777-3401b53da0d4
# uuid5 : 该方法生成一个基于名字的SHA-1散列值的UUID。
uuid5 = uuid.uuid5(uuid.NAMESPACE_DNS, 'python.org')
print(uuid5)
# 886313e1-3b8a-5372-9b90-0c9aee199e5d
import uuid
# 生成一个UUID对象
uid = uuid.uuid4()
# 获取UUID对象中的各组成部分
print(uid.variant)
# specified in RFC 4122
# 获取UUID版本号
print(uid.version)
# 4
# 获取UUID的16字节表示形式
print(uid.time_low)
# 639555713
# 获取UUID的16字节表示形式的高位部分
print(uid.int)
# 50670823968647269155594349421150412688
# 将UUID对象转换为十六进制字符串
print(uid.hex)
# '261ed88106f848ed9900c99676cd1f90'
# 将UUID对象转换为URN格式的字符串
print(uid.urn)
# 'urn:uuid:261ed881-06f8-48ed-9900-c99676cd1f90'
# 将UUID对象转换为字节串
print(uid.bytes)
# b'&\x1e\xd8\x81\x06\xf8H\xed\x99\x00\xc9\x96v\xcd\x1f\x90'

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!

打赏
Profile Image of the Author
Dream
Hello, I'm Dream.
公告
欢迎来到我的博客!爱学习爱进步。
分类
标签
最新动态
站点统计
文章
300
分类
5
标签
26
总字数
640,882
运行时长
0 天
最后活动
0 天前
站点信息
构建平台
Vercel
博客版本
Firefly v6.16.8
文章许可
CC BY-NC-SA 4.0
文章目录