如何用 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 幫助我們定義應用/數據庫中的唯一性,還幫助定義文檔、主機、應用、客戶端和其他情況的標識符。


原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/287305.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-23 13:08
下一篇 2024-12-23 13:08

相關推薦

  • Python列表中負數的個數

    Python列表是一個有序的集合,可以存儲多個不同類型的元素。而負數是指小於0的整數。在Python列表中,我們想要找到負數的個數,可以通過以下幾個方面進行實現。 一、使用循環遍歷…

    編程 2025-04-29
  • Python計算陽曆日期對應周幾

    本文介紹如何通過Python計算任意陽曆日期對應周幾。 一、獲取日期 獲取日期可以通過Python內置的模塊datetime實現,示例代碼如下: from datetime imp…

    編程 2025-04-29
  • 如何查看Anaconda中Python路徑

    對Anaconda中Python路徑即conda環境的查看進行詳細的闡述。 一、使用命令行查看 1、在Windows系統中,可以使用命令提示符(cmd)或者Anaconda Pro…

    編程 2025-04-29
  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • 蝴蝶優化算法Python版

    蝴蝶優化算法是一種基於仿生學的優化算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化算法Python版…

    編程 2025-04-29
  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智能、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29
  • Python清華鏡像下載

    Python清華鏡像是一個高質量的Python開發資源鏡像站,提供了Python及其相關的開發工具、框架和文檔的下載服務。本文將從以下幾個方面對Python清華鏡像下載進行詳細的闡…

    編程 2025-04-29
  • Python字典去重複工具

    使用Python語言編寫字典去重複工具,可幫助用戶快速去重複。 一、字典去重複工具的需求 在使用Python編寫程序時,我們經常需要處理數據文件,其中包含了大量的重複數據。為了方便…

    編程 2025-04-29

發表回復

登錄後才能評論