如何在 Python 中生成 UUID

2024 年 08 月 29 日 | 阅读 9 分钟

在本教程中,我们将讨论如何使用 uuid 模块在 Python 中生成 UUID。在深入探讨此主题之前,让我们先了解 UUID 的基本概念。

引言

UUID 是 **通用唯一标识符** 的缩写,也称为 GUID,即全局唯一标识符。它是一个 128 位长的 ID 号,用于唯一地定义文档、用户、资源或信息。UUID 有多种版本;我们将在接下来的部分讨论所有这些版本。

  • UUID 用于在空间和时间上定义唯一的标识符。空间和时间意味着一旦根据标准生成了 UUID,标识符就不会重复现有的资源。
  • 当需要唯一性时,UUID 是最适合的选项。
  • 它在密码学和哈希应用程序中起着至关重要的作用。

何时使用 UUID

UUID 模块可在以下场景中使用。

在 Web 应用程序中 -

  • UUID 通过生成 **唯一的会话 ID** 来帮助我们管理状态。
  • 通常,我们使用自动递增的值来生成用户 ID。这是一种非常直接且易于猜测的方法。然而,UUID 很难猜测,因为它们不是连续创建的。

在数据库系统中

  • 它为数据库带来了显著优势,因为 UUID 是独立于环境的。这意味着我们可以使用任何应用程序在任何机器上创建 UUID。
  • 大多数应用程序都依赖数据库服务器来生成唯一键或主键。UUID 是生成唯一数据库键的一个好选项,它可以帮助我们更改数据库中的键生成方法。
  • UUID 是一个真实值,而不是像 SQL 表中的数字那样的伪值。

Python uuid 模块

Python uuid 模块是根据 RFC 4122 实现的,这是一个互联网标准的版权。借助 Python UUID 模块,我们可以生成各种类型的 UUID,如 1、3、4 和 5 版本 UUID。Python 模块支持以下 UUID 版本。

  • UUID1 - 它使用 MAC 地址和当前时间分量生成唯一数字。
  • UUID4 - 它使用伪随机数生成器生成 UUID,这种类型的 UUID 非常适合用于安全目的。
  • UUID3 和 UUID5 - 它使用加密哈希和应用程序提供的文本字符串来生成 UUID。

使用 Python UUID 模块生成 UUID

让我们使用 Python uuid 模块生成各种版本的 UUID。

使用 uuid1() - 要生成 uuid,我们必须导入 uuid 模块,然后调用 uuid1() 方法。让我们理解下面的例子。

示例 - 1

输出

The random id using uuid1() is :  ab2d0fc0-7224-11ec-8ef2-b658b885fb3

UUID 的结构

如我们所见,上面的 UUID 中有五个组成部分,每个组成部分长度相同。UUID 的结构格式为 **“8-4-4-4-12”**。

UUID 的字符串表示如下所示 -

让我们分解上述 UUID 的字段

  • time_low - 它是 ID 的前 32 位。
  • time_mid - 它是 ID 的下一个 16 位。
  • time_high_and_version - 它是 ID 的下一个 16 位。
  • clock_seq_hi_variant:它是 ID 的下一个 8 位。
  • clock_seq_low:它是 ID 的下一个 8 位。
  • node:它是 ID 的最后 48 位。
  • time:它是 ID 的时间分量字段。
  • clock_seq:它是一个 14 位序列号。

让我们通过另一个例子来理解以字节、整数和十六进制等各种格式生成 UUID。

示例 - 2

输出

The byte Representations of uuid1() are : 
b'\xb9\xea\xb88s\x0e\x11\xec\xbfv\x86\xa0;\xe4`\x12'
int Representation : 247125913120858544596828814248071421970
hex Representation : b9eab838730e11ecbf7686a03be46012
The Components of uuid1() are : 
Version  : 1
Variant : specified in RFC 4122
The Fields of uuid1() are : 
Fields  : (3119167544, 29454, 4588, 191, 118, 148022757711890)
The time Component of uuid1() is : 
Time component  : 148022757711890
UUID.time_mid            :  29460
UUID.time_hi_version     :  4588
UUID.clock_seq_hi_variant:  186
UUID.clock_seq_low       :  100
UUID.node                :  90979746151630
UUID.time                :  138612218401246920
UUID.clock_seq           :  14948
UUID.SafeUUID           :  SafeUUID.unsafe

UUID1 的缺点

UUID1 与计算机的 MAC 地址相关联,因此可能对隐私构成威胁。然而,它提供了完全的唯一性。

方法 2:使用 uuid4()

此方法生成随机数,并保证保护隐私。让我们理解下面的例子。

示例 -

输出

The id generated using uuid4() : 53967be6-71e9-4ee9-9912-60d02d2d9b0a

uuid1() 与 uuid4

uuid1() 保证不会产生任何冲突。通过在不到 100ns 的时间内创建超过 16384 个 uuid1,我们可以创建 UUID 的重复项。它不保证隐私安全。如果您不希望显示您的计算机 MAC 地址,则不建议使用 uuid1()

uuid4() 方法通过使用加密生成的安全数生成器来生成随机 UUID。它生成更安全的 UUID。当需要在独立计算机上生成 UUID 时,建议使用此方法。

UUID 3 和 UUID 5 用于创建基于名称的 UUID

基于名称的 UUID 意味着我们可以使用版本 3 或 5 UUID 生成 UUID。

我们可以使用名称和命名空间创建一系列唯一的 UUID。版本 3 和 5 是对命名空间标识符进行哈希处理并附带名称。

uuid3() 方法生成一个基于命名空间标识符和字符串的 MD5 哈希值的 UUID。另一方面,uuid5() 方法生成基于命名空间标识符的 SHA-1 哈希技术的 UUID。

以下是 uuid3() 或 uuid5() 定义的命名空间标识符。

  • NAMESPACE_DNS - 它代表传统的域名。例如,https://javatpoint.com。
  • NAMESPACE_URL - 它代表一个 URL。
  • NAMESPACE_OID - 此命名空间指定了字符串 ISO OID。
  • NAMESPACE_X500 - 当指定此命名空间时,名称字符串是以 DER 或文本输出格式的 X.500 DN。

让我们通过下面的例子来使用各种主机名和命名空间生成 UUID3 和 UUID5。

示例 -

输出

Generate uuid 3 version using name as javatpoint.com  and namespace as uuid.NAMESPACE_DNS
98bbe92a-b38f-3289-a4b4-80ec1cfdf8cb
Generate uuid 5 version using name as javatpoint.com  and namespace as uuid.NAMESPACE_DNS
0fc2d4dd-7194-5200-8050-f0ca1dd04b3d
Generate uuid 3 version using name as tutorialandexample.com  and namespace as uuid.NAMESPACE_DNS
6f6fe445-1c4c-3874-854e-c79f617effe5
Generate uuid 5 version using name as tutorialandexample.com  and namespace as uuid.NAMESPACE_DNS
781c3cc9-4965-5fdc-9c40-89bb0ea8ec0d

示例 - 2:使用不同的命名空间生成 UUID 3 和 UUID 5

输出

Generate uuid using namespace
uuid 3 is 6ddc8513-dc7b-3b37-b21b-a1ca9440fe14
uuid 5 is 8d6a1314-170a-559c-afe7-b68d1d7ee9ac

uuid 3 is 5dcfef3e-bcc9-38bc-b989-4a7516a05974
uuid 5 is 3a4a6c31-8d6a-5583-8497-d2ed90b1f13a

uuid 3 is 84d9730f-330f-3634-9542-4acfcdcd6c60
uuid 5 is 899f3d4b-6095-5ee6-9805-68e0c51dcb39

uuid 3 is b140fa3b-983a-3efe-85ef-92f07d5e09a0
uuid 5 is 73b723ef-5c5e-5eb4-8fcc-aabb5c4e7803

uuid3 和 uuid5 的行为

  • 尽管具有相同的命名空间和相同的名称,但生成的 UUID 在不同时间是相同的。
  • 同一命名空间中的两个不同名称会生成不同的 ID。

示例 - 3

输出

Generate version 3 uuid using name as pynative.com and namespace as uuid.NAMESPACE_DNS
98bbe92a-b38f-3289-a4b4-80ec1cfdf8cb
Generate version 3 uuid using name as pynative.com and namespace as uuid.NAMESPACE_DNS
98bbe92a-b38f-3289-a4b4-80ec1cfdf8cb

如何在 Python 中将字符串转换为 UUID,将 UUID 转换为字符串?

uuid.uuid1() 方法返回 UUID 类的实例。我们可以使用 str() 方法获取 UUID 的字符串表示形式。相应的字符串格式可用于比较或操作。让我们理解下面的例子。

示例 -

输出

The version 1 UUID is  cdca7930-7488-11ec-a0c4-4984d2946471
UUID of version 1 in String format cdca7930-7488-11ec-a0c4-4984d2946471
Version 1 UUID in String format cdca7930-7488-11ec-a0c4-4984d2946471
Version 1 UUID in String removing dashes cdca7930748811eca0c44984d2946471

现在,我们将从字符串创建 UUID。

有时,我们收到的 UUID 是字符串格式的。我们的应用程序需要将其转换为 UUID 类实例以供某些应用程序使用。让我们理解下面的例子来转换字符串格式的 UUID。

示例 -

输出

UUID is c7c9de0a-d676-11e8-8d62-ccaf789d94a0
Time component is 137595594281180682

UUID is 018c168c-d509-11e8-b096-ccaf789d94a0
Time component is 137594023292180108

UUID is e5e9394c-daed-498e-b9f3-69228b44fbfa
Time component is 688728508333635916

示例 - 2

输出

string UUID
urn:uuid:f2f84497-b3bf-493a-bba9-7c68e6def80b
{417a5ebb-01f7-4ed5-aeac-3d56cd5037b0}
2115773a-5bf1-11dd-ab48-001ec200d9e0

converted to uuids
f2f84497-b3bf-493a-bba9-7c68e6def80b
417a5ebb-01f7-4ed5-aeac-3d56cd5037b0
2115773a-5bf1-11dd-ab48-001ec200d9e0

sorted value
2115773a-5bf1-11dd-ab48-001ec200d9e0
417a5ebb-01f7-4ed5-aeac-3d56cd5037b0
f2f84497-b3bf-493a-bba9-7c68e6def80b

生成可重现的 UUID

如前所述,UUID 有各种属性。我们可以使用其任何属性来使用相同的 UUID。使用 **uuid 模块**,我们可以使用种子值随时生成相同的 **uuid**。种子值也可用于生成相同的 UUID。让我们同时理解这两个概念。

以下输入可用于创建 UUID 实例。

  • String
  • 字节
  • Bytes_le
  • 字段
  • int

使用以上任何一个值,都可以生成 UUID。让我们看下面的例子,我们在其中使用所有这些值来生成相同的 UUID。

示例 -

输出

Generating UUID from int
UUID is b1d0cac0-d50d-11e8-b57b-ccaf789d94a0
UUID from URN
UUID is b1d0cac0-d50d-11e8-b57b-ccaf789d94a0
UUID from bytes
UUID is b1d0cac0-d50d-11e8-b57b-ccaf789d94a0
UUID from bytes_len
UUID is b1d0cac0-d50d-11e8-b57b-ccaf789d94a0
UUID from fields
UUID is b1d0cac0-d50d-11e8-b57b-ccaf789d94a0

使用种子重现 UUID

顾名思义,Faker 模块为我们生成假数据。我们已经使用 faker 模块来重复生成相同的 UUID。让我们理解下面的例子。

示例 -

输出

b1d0cac0-d50d-11e8-b57b-ccaf789d94a0
b1d0cac0-d50d-11e8-b57b-ccaf789d94a0

结论

在本教程中,我们详细讨论了 uuid 模块,并了解了如何生成各种 UUID。UUID 帮助我们在应用程序/数据库中定义唯一性,也有助于为文档、主机、应用程序、客户端和其他情况定义标识符。