在本教程中,我們將討論如何使用 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 幫助我們定義應用/資料庫中的唯一性,還幫助定義文檔、主機、應用、客戶端和其他情況的標識符。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/287305.html