如何在Python中生成UUID

如何在Python中生成UUID

在本教程中,我们将讨论如何使用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

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.

让我们来分解一下上面的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:

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

UUID1的缺点

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

方法2:使用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() vs uuid4

The uuid1() 提供了不生成任何冲突的保证。我们可以通过在少于100纳秒的时间内创建超过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。

示例

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

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

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

生成可复制的UUID

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

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

  • String(字符串)
  • Bytes(字节)
  • Bytes_le(字节逆序)
  • Fields(字段)
  • int(整数)

使用以上任意值,都可以生成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。UUID帮助我们在应用程序/数据库中定义唯一性,并帮助定义文档、主机、应用程序、客户端和其他情况的标识符。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程