您的位置:

如何用 Python 生成 UUID

在本教程中,我们将讨论如何使用 uuid 模块在 Python 中生成 UUID。在进入这个话题之前,让我们先了解一下 UUID 的基本概念。

介绍

UUID 是通用唯一标识符的缩写名称,也称为 GUID,即全球唯一标识符。它是一个 128 位长的标识号,用于唯一定义文档、用户、资源或信息。UUIDs 有多种版本;我们将在接下来的章节中讨论它们。

  • UUID 用于定义跨空间和时间的唯一标识符。空间和时间意味着,一旦按照标准生成 UUID,标识符就不能与现有资源重复。
  • 当需要独特性时,UUID 是最合适的选择。
  • 它在密码学和哈希应用中起着至关重要的作用。

什么时候用 UUID

UUID 模块可用于以下场景。

在网络应用中-

  • UUID 通过生成唯一的会话 ID 来帮助我们管理状态。
  • 通常,我们使用自动增量值来生成用户 id。这是一个相当简单的方法,很容易猜测。然而,UUIDs 很难猜测,因为它们不是连续创建的。

在数据库系统中

  • 它在数据库中提供了显著的优势,因为 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


import uuid
# Printing random id using uuid1()
print ("The random generated uuid is : ", uuid.uuid1())

输出:

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

UUID 的结构

我们可以看到,在上面的 UUID 中有五个分量,每个分量都有相同的长度。UUID 的结构是“8-4-4-4-12”的格式。

UUID 字符串表示如下-


UUID = time_low "-" time_mid "-"time_high_and_version " "clock_seq_and_reserved_And_clock_seq_low"-" Node.

让我们分解一下上面的 UUIDs 字段

  • 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 位。
  • 节点:是 id 的最后 48 位。
  • 时间:是 id 的时间成分字段。
  • clock_seq : 是一个 14 位的序列号。

让我们了解另一个以各种格式(如字节、整数和十六进制)生成 UUID 的例子。

示例- 2:


import uuid

id = uuid.uuid1()

# Representations of uuid1()
print ("The byte Representations of uuid1() are : ")
print (repr(id.bytes))

print ("Integer Value Representation: ",end="")
print(id.int)

print ("hex Value Representation : ",end="")
print (id.hex)

print("\n")

# The components of uuid1()
print ("The components of uuid1() are : ")
print ("Version  : ",end="")
print (id.version)

print ("Variant : ",end="")
print (id.variant)

print("\n")

# Fields of uuid1()
print ("The Fields of uuid1() are : ")
print ("Fields  : ",end="")
print (id.fields)
print('UUID.fields  :', id.fields)
print("Prining each field seperately")
print('UUID.time_low            : ', id.time_low)
print('UUID.time_mid            : ', id.time_mid)
print('UUID.time_hi_version     : ', id.time_hi_version)
print('UUID.clock_seq_hi_variant: ', id.clock_seq_hi_variant)
print('UUID.clock_seq_low       : ', id.clock_seq_low)
print('UUID.node                : ', id.node)
print('UUID.time                : ', id.time)
print('UUID.clock_seq           : ', id.clock_seq)
print('UUID.SafeUUID           : ', id.is_safe)
print("\n")
# The time Component of uuid1()
print ("The time Component of uuid1() is : ")
print ("Time component  : ",end="")
print (id.node)

输出:

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

uuid 1 的缺点

UUID1 与计算机的媒体访问控制地址相关联,因此可能对隐私构成威胁。然而,它提供了完全的独特性。

方法二:使用 uuid4()

该方法在保证隐私安全的情况下生成随机数。让我们理解下面的例子。

示例-


import uuid
id = uuid.uuid4()

# Id generated using uuid4()
print ("The id generated using uuid4() : ",end="")
print (id)

输出:

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

uuid1 与 uuid4

uuid1() 保证不会产生任何碰撞。我们可以通过在不到 100 秒的时间内创建超过 16384 个 uuid1 来创建 uuid 的副本。它不能保证隐私安全。如果您不想看到机器的 MAC 地址,不建议使用 uuid1() 。

uuid4()方法通过使用加密生成的安全数字生成器生成随机 uuid。它生成更安全的 UUIDs。当 UUIDs 需要在不同的机器上生成时,建议使用。

UUID 3 号和 UUID 5 号创造了一个以名字为基础的 UUID

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

我们可以使用名称和名称空间来创建一系列唯一的 UUIDs。版本 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。

示例-


import uuid

host_names = ['javatpoint.com', 'tutorialandexample.com']

for host in host_names:
    print('Generate uuid 3 version using name as',host,' and namespace as uuid.NAMESPACE_DNS')
    print(uuid.uuid3(uuid.NAMESPACE_DNS, host))
    print('Generate uuid 5 version using name as', host, ' and namespace as uuid.NAMESPACE_DNS'),
    print(uuid.uuid5(uuid.NAMESPACE_DNS, host))
    print()

输出:

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


import uuid
name_spaces = [uuid.NAMESPACE_DNS, uuid.NAMESPACE_URL, uuid.NAMESPACE_OID, uuid.NAMESPACE_X500]
host_name = 'pynative.com'
print("Generate uuid using namespace")

for namespace in name_spaces:
    print('uuid 3 is', uuid.uuid3(namespace, host_name))
    print('uuid 5 is', uuid.uuid5(namespace, host_name))
    print()

输出:

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 的行为

  • 尽管相同的命名空间和相同的名称是相似的,但是 UUIDs 是在不同的时间生成的。
  • 同一个命名空间中的两个不同的命名空间是不同的,它生成唯一的 Ids。

示例- 3


import uuid
print('Generate version 3 uuid using name as pynative.com and namespace as uuid.NAMESPACE_DNS')
print(uuid.uuid3(uuid.NAMESPACE_DNS, "javatpoint.com"))

print('Generate version 3 uuid using name as pynative.com and namespace as uuid.NAMESPACE_DNS')
print(uuid.uuid3(uuid.NAMESPACE_DNS, "javatpoint.com"))

输出:

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 的字符串表示。相应的字符串格式可用于比较或操作。让我们理解下面的例子。

示例-


import uuid
UUID1_VAL = uuid.uuid1()
print("The version 1 UUID is ", UUID1_VAL)
# convert a UUID to a string of hex digits in standard form
print("The version 1 UUID in String format", str(UUID1_VAL))
# Use replace() method to remove dashes from string
uuidString = str(UUID1).replace("-", "")
print("Version 1 UUID in String removing dashes", uuidString)

输出:

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 的示例。

示例-


import uuid
import uuid
UUIDStrings = ["{c7c9de0a-d676-11e8-8d62-ccaf789d94a0}", "018c168c-d509-11e8-b096-ccaf789d94a0", "urn:uuid:e5e9394c-daed-498e-b9f3-69228b44fbfa"]
for string in UUIDStrings:
    # make a UUID from a string of hex digits (braces and hyphens ignored)
    myUUID = uuid.UUID(string)
    print("My UUID is", myUUID)
    print("My UUID time component is", myUUID.time)
    print()

输出:

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:


import uuid
def display(message, l):
    print(message)
    for v in l:
        print(v)
    print()

string_uuids = [ 
    'urn:uuid:f2f84497-b3bf-493a-bba9-7c68e6def80b',
    '{417a5ebb-01f7-4ed5-aeac-3d56cd5037b0}',
    '2115773a-5bf1-11dd-ab48-001ec200d9e0',
    ]

display('string UUID', string_uuids)

uuids = [ uuid.UUID(s) for s in string_uuids ]
display('converted to uuids', uuids)

uuids.sort()
display('sorted value', uuids)

输出:

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

生成可复制的 UUIDs

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

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

  • 线
  • 字节
  • 字节数(_ l)
  • 菲尔茨
  • (同 Internationalorganizations)国际组织

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

示例-


import uuid

print("Generating UUID from int")
UUID_x = uuid.UUID(int=236357465324988601727440242910546465952)
print("UUID is", UUID_x)

print("UUID from URN")
UUID_x1 = uuid.UUID('urn:uuid:b1d0cac0-d50d-11e8-b57b-ccaf789d94a0')
print("UUID is", UUID_x1)

print("UUID from bytes")
UUID_x2 = uuid.UUID(bytes=b'\xb1\xd0\xca\xc0\xd5\r\x11\xe8\xb5{\xcc\xafx\x9d\x94\xa0')
print("UUID is", UUID_x2)

print("UUID from bytes_len")
UUID_x3 = uuid.UUID(bytes_le=b'\xc0\xca\xd0\xb1\r\xd5\xe8\x11\xb5{\xcc\xafx\x9d\x94\xa0')
print("UUID is", UUID_x3)

print("UUID from fields")
UUID_x4 = uuid.UUID(fields=(2983250624, 54541, 4584, 181, 123, 225054014936224))
print("UUID is", UUID_x4)

输出:

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。让我们理解下面的例子。

示例-


import uuid
from faker import Faker

fake_obj = Faker()
fake_obj.seed(8754)
print(faker_obj.uuid4())

fake_obj.seed(8754)
print(fake_obj.uuid4())

输出:

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

结论

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