如何在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帮助我们在应用程序/数据库中定义唯一性,并帮助定义文档、主机、应用程序、客户端和其他情况的标识符。