uuid — 符合 RFC 9562 的 UUID 物件

原始碼: Lib/uuid.py


此模組提供不可變的 UUID 物件(UUID 類)和 函式,用於生成符合 RFC 9562(它取代了 RFC 4122)中指定特定 UUID 版本的 UUID,例如,uuid1() 用於 UUID 版本 1,uuid3() 用於 UUID 版本 3,等等。請注意,UUID 版本 2 被有意省略,因為它超出了 RFC 的範圍。

如果只需要一個唯一的 ID,則應呼叫 uuid1()uuid4()。請注意,uuid1() 可能會損害隱私,因為它會建立一個包含計算機網路地址的 UUID。uuid4() 建立一個隨機 UUID。

根據底層平臺的支援,uuid1() 可能會或可能不會返回“安全”的 UUID。安全的 UUID 是使用同步方法生成的,這些方法確保沒有兩個程序可以獲得相同的 UUID。UUID 的所有例項都有一個 is_safe 屬性,它使用此列舉來傳遞有關 UUID 安全性的任何資訊

class uuid.SafeUUID

在 3.7 版本加入。

safe

UUID 由平臺以多程序安全的方式生成。

unsafe

UUID 未以多程序安全的方式生成。

unknown

平臺不提供有關 UUID 是否安全生成的資訊。

class uuid.UUID(hex=None, bytes=None, bytes_le=None, fields=None, int=None, version=None, *, is_safe=SafeUUID.unknown)

透過 32 個十六進位制數字字串、以大端位元組序排列的 16 位元組字串作為 bytes 引數、以小端位元組序排列的 16 位元組字串作為 bytes_le 引數、六個整數的元組(32 位 time_low、16 位 time_mid、16 位 time_hi_version、8 位 clock_seq_hi_variant、8 位 clock_seq_low、48 位 node)作為 fields 引數,或者單個 128 位整數作為 int 引數來建立 UUID。當給定十六進位制數字字串時,花括號、連字元和 URN 字首都是可選的。例如,這些表示式都生成相同的 UUID

UUID('{12345678-1234-5678-1234-567812345678}')
UUID('12345678123456781234567812345678')
UUID('urn:uuid:12345678-1234-5678-1234-567812345678')
UUID(bytes=b'\x12\x34\x56\x78'*4)
UUID(bytes_le=b'\x78\x56\x34\x12\x34\x12\x78\x56' +
              b'\x12\x34\x56\x78\x12\x34\x56\x78')
UUID(fields=(0x12345678, 0x1234, 0x5678, 0x12, 0x34, 0x567812345678))
UUID(int=0x12345678123456781234567812345678)

hexbytesbytes_lefieldsint 中必須且只能指定一個。version 引數是可選的;如果給定,則結果 UUID 的變體和版本號將根據 RFC 9562 設定,覆蓋給定 hexbytesbytes_lefieldsint 中的位。

UUID 物件的比較透過比較它們的 UUID.int 屬性進行。與非 UUID 物件的比較會引發 TypeError

str(uuid) 返回形式為 12345678-1234-5678-1234-567812345678 的字串,其中 32 個十六進位制數字表示 UUID。

UUID 例項具有以下只讀屬性

UUID.bytes

UUID 作為 16 位元組字串(包含六個整數字段,以大端位元組序排列)。

UUID.bytes_le

UUID 作為 16 位元組字串(其中 time_lowtime_midtime_hi_version 以小端位元組序排列)。

UUID.fields

一個包含 UUID 六個整數字段的元組,這些欄位也可用作六個單獨的屬性和兩個派生屬性

欄位

含義

UUID.time_low

UUID 的前 32 位。僅與版本 1 相關。

UUID.time_mid

UUID 的接下來的 16 位。僅與版本 1 相關。

UUID.time_hi_version

UUID 的接下來的 16 位。僅與版本 1 相關。

UUID.clock_seq_hi_variant

UUID 的接下來的 8 位。僅與版本 1 和 6 相關。

UUID.clock_seq_low

UUID 的接下來的 8 位。僅與版本 1 和 6 相關。

UUID.node

UUID 的最後 48 位。僅與版本 1 相關。

UUID.time

對於版本 1 和 6,是自格里高利曆紀元(1582-10-15 00:00:00)以來 100 納秒間隔數的 60 位時間戳;對於版本 7,是自 Unix 紀元(1970-01-01 00:00:00)以來毫秒數的 48 位時間戳。

UUID.clock_seq

14 位序列號。僅與版本 1 和 6 相關。

UUID.hex

UUID 作為 32 個字元的小寫十六進位制字串。

UUID.int

UUID 作為 128 位整數。

UUID.urn

UUID 作為 RFC 9562 中指定的 URN。

UUID.variant

UUID 變體,它決定了 UUID 的內部佈局。這將是常量 RESERVED_NCSRFC_4122RESERVED_MICROSOFTRESERVED_FUTURE 之一。

UUID.version

UUID 版本號(1 到 8,僅當變體為 RFC_4122 時才有意義)。

3.14 版本中的變化: 添加了 UUID 版本 6、7 和 8。

UUID.is_safe

一個 SafeUUID 列舉,指示平臺是否以多程序安全的方式生成 UUID。

在 3.7 版本加入。

uuid 模組定義了以下函式

uuid.getnode()

將硬體地址作為 48 位正整數獲取。首次執行時,它可能會啟動一個單獨的程式,這可能會很慢。如果所有獲取硬體地址的嘗試都失敗,我們將選擇一個隨機的 48 位數字,其中多播位(第一個八位位元組的最低有效位)設定為 1,如 RFC 4122 中建議的那樣。“硬體地址”是指網路介面的 MAC 地址。在具有多個網路介面的機器上,普遍管理的 MAC 地址(即第一個八位位元組的倒數第二位未設定)將優於本地管理的 MAC 地址,但沒有其他排序保證。

3.7 版本中的變化: 普遍管理的 MAC 地址優於本地管理的 MAC 地址,因為前者保證全域性唯一,而後者不保證。

uuid.uuid1(node=None, clock_seq=None)

根據 RFC 9562, §5.1 從主機 ID、序列號和當前時間生成 UUID。

未指定 node 時,使用 getnode() 獲取 48 位正整數的硬體地址。未指定序列號 clock_seq 時,生成一個偽隨機的 14 位正整數。

如果 nodeclock_seq 超出其預期的位計數,則僅保留其最低有效位。

uuid.uuid3(namespace, name)

根據 RFC 9562, §5.3,基於名稱空間識別符號(即 UUID)和名稱(即 bytes 物件或將使用 UTF-8 編碼的字串)的 MD5 雜湊生成 UUID。

uuid.uuid4()

根據 RFC 9562, §5.4,以密碼安全的方式生成隨機 UUID。

uuid.uuid5(namespace, name)

根據 RFC 9562, §5.5,基於名稱空間識別符號(即 UUID)和名稱(即 bytes 物件或將使用 UTF-8 編碼的字串)的 SHA-1 雜湊生成 UUID。

uuid.uuid6(node=None, clock_seq=None)

根據 RFC 9562, §5.6 從序列號和當前時間生成 UUID。

這是 uuid1() 的替代方案,用於改善資料庫區域性性。

未指定 node 時,使用 getnode() 獲取 48 位正整數的硬體地址。未指定序列號 clock_seq 時,生成一個偽隨機的 14 位正整數。

如果 nodeclock_seq 超出其預期的位計數,則僅保留其最低有效位。

在 3.14 版本加入。

uuid.uuid7()

根據 RFC 9562, §5.7 生成基於時間的 UUID。

為了在缺乏亞毫秒精度的平臺之間實現可移植性,此函式生成的 UUID 嵌入一個 48 位時間戳,並使用一個 42 位計數器來保證毫秒內的單調性。

在 3.14 版本加入。

uuid.uuid8(a=None, b=None, c=None)

根據 RFC 9562, §5.8 生成偽隨機 UUID。

指定時,引數 abc 預期分別為 48 位、12 位和 62 位的正整數。如果它們超出其預期的位計數,則僅保留其最低有效位;未指定的引數將替換為適當大小的偽隨機整數。

預設情況下,abc 不是由密碼安全偽隨機數生成器 (CSPRNG) 生成的。當 UUID 需要在安全敏感上下文中使用時,請使用 uuid4()

在 3.14 版本加入。

uuid 模組定義了以下名稱空間識別符號,用於 uuid3()uuid5()

uuid.NAMESPACE_DNS

指定此名稱空間時,name 字串是完全限定的域名。

uuid.NAMESPACE_URL

指定此名稱空間時,name 字串是 URL。

uuid.NAMESPACE_OID

指定此名稱空間時,name 字串是 ISO OID。

uuid.NAMESPACE_X500

指定此名稱空間時,name 字串是 DER 或文字輸出格式的 X.500 DN。

uuid 模組定義了以下常量,用於 variant 屬性的可能值

uuid.RESERVED_NCS

保留用於 NCS 相容性。

uuid.RFC_4122

指定 RFC 4122 中給出的 UUID 佈局。此常量為了向後相容性而保留,儘管 RFC 4122 已被 RFC 9562 取代。

uuid.RESERVED_MICROSOFT

保留用於 Microsoft 相容性。

uuid.RESERVED_FUTURE

保留供將來定義。

uuid 模組定義了特殊的 Nil 和 Max UUID 值

uuid.NIL

根據 RFC 9562, §5.9,一種特殊的 UUID 形式,其所有 128 位都設定為零。

在 3.14 版本加入。

uuid.MAX

根據 RFC 9562, §5.10,一種特殊的 UUID 形式,其所有 128 位都設定為一。

在 3.14 版本加入。

參見

RFC 9562 - 通用唯一識別符號 (UUID) URN 名稱空間

此規範定義了 UUID 的統一資源名稱名稱空間、UUID 的內部格式以及生成 UUID 的方法。

命令列用法

3.12 新版功能.

uuid 模組可以作為指令碼從命令列執行。

python -m uuid [-h] [-u {uuid1,uuid3,uuid4,uuid5,uuid6,uuid7,uuid8}] [-n NAMESPACE] [-N NAME]

接受以下選項

-h, --help

顯示幫助資訊並退出。

-u <uuid>
--uuid <uuid>

指定用於生成 uuid 的函式名稱。預設使用 uuid4()

3.14 版本中的變化: 允許生成 UUID 版本 6、7 和 8。

-n <namespace>
--namespace <namespace>

名稱空間是 UUID,或者是 @ns,其中 ns 是由名稱空間名稱定址的知名預定義 UUID。例如 @dns@url@oid@x500。僅 uuid3() / uuid5() 函式需要。

-N <name>
--name <name>

用作生成 uuid 的一部分的名稱。僅 uuid3() / uuid5() 函式需要。

-C <num>
--count <num>

生成 num 個新的 UUID。

在 3.14 版本加入。

示例

以下是一些 uuid 模組的典型用法示例

>>> import uuid

>>> # make a UUID based on the host ID and current time
>>> uuid.uuid1()
UUID('a8098c1a-f86e-11da-bd1a-00112444be1e')

>>> # make a UUID using an MD5 hash of a namespace UUID and a name
>>> uuid.uuid3(uuid.NAMESPACE_DNS, 'python.org')
UUID('6fa459ea-ee8a-3ca4-894e-db77e160355e')

>>> # make a random UUID
>>> uuid.uuid4()
UUID('16fd2706-8baf-433b-82eb-8c7fada847da')

>>> # make a UUID using a SHA-1 hash of a namespace UUID and a name
>>> uuid.uuid5(uuid.NAMESPACE_DNS, 'python.org')
UUID('886313e1-3b8a-5372-9b90-0c9aee199e5d')

>>> # make a UUID from a string of hex digits (braces and hyphens ignored)
>>> x = uuid.UUID('{00010203-0405-0607-0809-0a0b0c0d0e0f}')

>>> # convert a UUID to a string of hex digits in standard form
>>> str(x)
'00010203-0405-0607-0809-0a0b0c0d0e0f'

>>> # get the raw 16 bytes of the UUID
>>> x.bytes
b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f'

>>> # make a UUID from a 16-byte string
>>> uuid.UUID(bytes=x.bytes)
UUID('00010203-0405-0607-0809-0a0b0c0d0e0f')

>>> # get the Nil UUID
>>> uuid.NIL
UUID('00000000-0000-0000-0000-000000000000')

>>> # get the Max UUID
>>> uuid.MAX
UUID('ffffffff-ffff-ffff-ffff-ffffffffffff')

>>> # same as UUIDv1 but with fields reordered to improve DB locality
>>> uuid.uuid6()
UUID('1f0799c0-98b9-62db-92c6-a0d365b91053')

>>> # get UUIDv7 creation (local) time as a timestamp in milliseconds
>>> u = uuid.uuid7()
>>> u.time
1743936859822

>>> # get UUIDv7 creation (local) time as a datetime object
>>> import datetime as dt
>>> dt.datetime.fromtimestamp(u.time / 1000)
datetime.datetime(...)

>>> # make a UUID with custom blocks
>>> uuid.uuid8(0x12345678, 0x9abcdef0, 0x11223344)
UUID('00001234-5678-8ef0-8000-000011223344')

命令列示例

以下是 uuid 命令列介面的典型用法示例

# generate a random UUID - by default uuid4() is used
$ python -m uuid

# generate a UUID using uuid1()
$ python -m uuid -u uuid1

# generate a UUID using uuid5
$ python -m uuid -u uuid5 -n @url -N example.com

# generate 42 random UUIDs
$ python -m uuid -C 42