# 21.20. `uuid` — 根据RFC 4122实现的UUID对象

源代码： Lib/uuid.py

本模块提供不可变对象`UUID` (`UUID`类)和函数`uuid1()`、`uuid3()`、`uuid4()`、`uuid5()`来生成版本1、3、4和5 UUIDs，它们在 RFC 4122中具体说明。

如果你想要唯一的 ID，你可以调用`uuid1()`或`uuid4()`。请注意 `uuid1()`创建的UUID包含计算机的网络地址，可能会有安全问题。`uuid4()`创建一个随机的UUID。

class `uuid.``UUID`(hex=None, bytes=None, bytes_le=None, fields=None, int=None, version=None)

  创建一个UUID，hex参数表示一个32个十六进制数字的字符串、bytes参数表示一个16个字节的字符串、bytes_le参数表示16个字节的小端序字符串、fields参数表示一个6个整数的元组(32位的time_low, 16位的time_mid, 16位的time_hi_version, 8位的 clock_seq_hi_variant, 8位的clock_seq_low, 48位的node) 、int参数表示一个128的整数。当给出的是一个十六进制数字字符串时，花括号、连字符和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)

  hex、bytes，bytes_le、fields或int中的一个必须给定。version参数是可选的；如果给出，则得到的UUID将根据RFC 4122设置其变体和版本号，重写给定的hex、bytes、bytes_le、fields或int。

`UUID`实例具有以下只读属性：

`UUID.``bytes`

  UUID为16字节字符串（包含大字节顺序的6个整数字段）。

`UUID.``bytes_le`

  作为16字节字符串（以小端字节顺序具有time_low，time_mid和time_hi_version）的UUID。

`UUID.``fields`

  UUID的六个整数字段的元组，它们也可作为六个单独的属性和两个派生属性：

  字段 | 含义
  --- | ---
  `time_low` | UUID的前32位
  `time_mid` | 接下来的16位的UUID
  `time_hi_version` | 接下来的16位的UUID
  `clock_seq_hi_variant` | 接下来的8位的UUID
  `clock_seq_low` | 接下来的8位的UUID
  `node` | UUID的最后48位
  `time` | 60位时间戳
  `clock_seq` | 14位序列号

`UUID.``hex`

  32个字符的十六进制字符串表示的UUID。

`UUID.``int`

  128位整数表示的UUID。

`UUID.``urn`

  UUID作为RFC 4122中指定的URN。

`UUID.``variant`

  UUID变量，它确定UUID的内部布局。这将是整数常数`RESERVED_NCS`，`RFC_4122`，`RESERVED_MICROSOFT`或`RESERVED_FUTURE`中的一个。

`UUID.``version`

  UUID版本号（1到5，仅当变体为`RFC_4122`时有意义）。

`uuid`模块定义了以下功能：

`uuid.``getnode`()

  获取硬件地址作为48位正整数。第一次运行时，它可能启动一个单独的程序，这可能会很慢。如果所有尝试获取硬件地址失败，我们选择一个随机的48位数，其第八位设置为1，如RFC 4122中推荐的。“硬件地址”是指网络接口的MAC地址，在具有多个网络接口的机器上，可以返回其中任何一个的MAC地址。

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

  基于主机ID，序列号，当前时间生成UUID。如果未给出节点，则使用`getnode()`来获取硬件地址。如果给定clock_seq，则将其用作序列号；否则选择随机的14比特序列号。

`uuid.``uuid3`(namespace, name)

  基于命名空间标识符（一个UUID）和一个名称（一个字符串）的MD5哈希生成UUID。

`uuid.``uuid4`()

  生成随机UUID。

`uuid.``uuid5`(namespace, name)

  基于命名空间标识符（其是UUID）和名称（其是字符串）的SHA-1散列来生成UUID。

`uuid`模块定义了用于`uuid3()`或`uuid5()`的以下命名空间标识符。

`uuid.``NAMESPACE_DNS`

  指定此命名空间时，name字符串是一个FQDN。

`uuid.``NAMESPACE_URL`

  指定此命名空间时，name字符串是一个URL。

`uuid.``NAMESPACE_OID`

  指定此命名空间时，名称字符串是ISO OID。

`uuid.``NAMESPACE_X500`

  指定此命名空间时，名称字符串是DER中的X.500 DN或文本输出格式。

`uuid`模块为`variant`属性的可能值定义了以下常量：

`uuid.``RESERVED_NCS`

  保留NCS兼容性。

`uuid.``RFC_4122`

  指定 RFC 4122中给出的UUID布局。

`uuid.``RESERVED_MICROSOFT`

  保留用于Microsoft兼容性。

`uuid.``RESERVED_FUTURE`

  留作将来定义。

也可以看看

RFC 4122 - 通用唯一标识符（UUID）URN命名空间
  该规范定义了UUID的统一资源名称命名空间，UUID的内部格式以及生成UUID的方法。

## 21.20.1. Example

以下是`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')