uuid — Objetos UUID conforme RFC 9562

Código-fonte: Lib/uuid.py


Este módulo fornece objetos UUID imutáveis ​​(a classe UUID) e funções para gerar UUIDs correspondentes a uma versão específica de UUID, conforme especificado em RFC 9562 (que substitui RFC 4122), por exemplo, uuid1() para a versão 1 de UUID, uuid3() para a versão 3 de UUID e assim por diante. Observe que a versão 2 de UUID foi omitida deliberadamente, pois está fora do escopo da RFC.

Se tudo o que você quer é um ID único, você provavelmente deve chamar uuid1() ou uuid4(). Note que uuid1() pode comprometer a privacidade, pois cria um UUID contendo o endereço de rede do computador. uuid4() cria um UUID aleatório.

Dependendo do suporte da plataforma subjacente, uuid1() pode ou não retornar um UUID “seguro”. Um UUID seguro é aquele que é gerado usando métodos de sincronização que garantem que dois processos não possam obter o mesmo UUID. Todas as instâncias de UUID têm um atributo is_safe que retransmite qualquer informação sobre a segurança do UUID, usando esta enumeração:

class uuid.SafeUUID

Adicionado na versão 3.7.

safe

O UUID foi gerado pela plataforma de forma segura para multiprocessamento.

unsafe

O UUID não foi gerado de forma segura para multiprocessamento.

unknown

A plataforma não fornece informações sobre se o UUID foi gerado com segurança ou não.

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

Cria um UUID a partir de uma sequência de 32 dígitos hexadecimais, uma sequência de 16 bytes em ordem big-endian como o argumento bytes, uma sequência de 16 bytes em ordem little-endian como o argumento bytes_le, uma tupla de seis inteiros (time_low de 32 bits, time_mid de 16 bits, time_hi_version de 16 bits, clock_seq_hi_variant de 8 bits, clock_seq_low de 8 bits, node de 48 bits) como o argumento fields ou um único inteiro de 128 bits como o argumento int. Quando uma sequência de dígitos hexadecimais é fornecida, chaves, hifens e um prefixo URN são todos opcionais. Por exemplo, todas essas expressões produzem o mesmo 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)

Exatamente um de hex, bytes, bytes_le, fields ou int deve ser fornecido. O argumento version é opcional; se fornecido, o UUID resultante terá sua variante e número de versão definidos de acordo com RFC 9562, substituindo bits no hex, bytes, bytes_le, fields ou int fornecido.

A comparação de objetos UUID é feita por meio da comparação de seus atributos UUID.int. A comparação com um objeto não UUID levanta uma TypeError.

str(uuid) retorna uma string no formato 12345678-1234-5678-1234-567812345678 onde os 32 dígitos hexadecimais representam o UUID.

As instâncias UUID têm estes atributos de somente leitura:

UUID.bytes

O UUID como uma string de 16 bytes (contendo os seis campos inteiros em ordem de bytes big-endian).

UUID.bytes_le

O UUID como uma string de 16 bytes (com time_low, time_mid e time_hi_version em ordem de bytes little-endian).

UUID.fields

Uma tupla dos seis campos de inteiros do UUID, que também estão disponíveis como seis atributos individuais e dois atributos derivados:

Campo

Significado

UUID.time_low

Os primeiros 32 bits do UUID. Relevante apenas para a versão 1.

UUID.time_mid

Os próximos 16 bits do UUID. Relevante apenas para a versão 1.

UUID.time_hi_version

Os próximos 16 bits do UUID. Relevante apenas para a versão 1.

UUID.clock_seq_hi_variant

Os próximos 8 bits do UUID. Relevante apenas para as versões 1 e 6.

UUID.clock_seq_low

Os próximos 8 bits do UUID. Relevante apenas para as versões 1 e 6.

UUID.node

Os últimos 48 bits do UUID. Relevante apenas para a versão 1.

UUID.time

O registro de data e hora de 60 bits como uma contagem de intervalos de 100 nanossegundos desde a época gregoriana (1582-10-15 00:00:00) para as versões 1 e 6, ou o registro de data e hora de 48 bits em milissegundos desde a época Unix (1970-01-01 00:00:00) para a versão 7.

UUID.clock_seq

Número de sequência de 14 bits. Relevante apenas para as versões 1 e 6.

UUID.hex

O UUID como uma sequência hexadecimal de 32 caracteres minúsculos.

UUID.int

O UUID como um inteiro de 128 bits.

UUID.urn

O UUID como um URN conforme especificado no RFC 9562.

UUID.variant

A variante UUID, que determina o layout interno do UUID. Esta será uma das constantes RESERVED_NCS, RFC_4122, RESERVED_MICROSOFT ou RESERVED_FUTURE.

UUID.version

O número da versão do UUID (1 a 8, significativo somente quando a variante é RFC_4122).

Alterado na versão 3.14: Adicionadas versões 6, 7 e 8 do UUID.

UUID.is_safe

Uma enumeração de SafeUUID que indica se a plataforma gerou o UUID de forma segura para multiprocessamento.

Adicionado na versão 3.7.

O módulo uuid define as seguintes funções:

uuid.getnode()

Obtém o endereço de hardware como um inteiro positivo de 48 bits. Na primeira vez que isso for executado, ele pode iniciar um programa separado, o que pode ser bem lento. Se todas as tentativas de obter o endereço de hardware falharem, escolhemos um número aleatório de 48 bits com o bit multicast (bit menos significativo do primeiro octeto) definido como 1, conforme recomendado no RFC 4122. “Endereço de hardware” significa o endereço MAC de uma interface de rede. Em uma máquina com várias interfaces de rede, endereços MAC administrados universalmente (ou seja, onde o segundo bit menos significativo do primeiro octeto é não definido) serão preferidos em relação a endereços MAC administrados localmente, mas sem nenhuma outra garantia de ordenação.

Alterado na versão 3.7: Endereços MAC administrados universalmente são preferidos em vez de endereços MAC administrados localmente, pois os primeiros têm garantia de serem globalmente exclusivos, enquanto os últimos não.

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

Gera um UUID a partir de um ID de host, número de sequência e hora atual de acordo com RFC 9562, §5.1.

Quando node não é especificado, getnode() é usado para obter o endereço de hardware como um inteiro positivo de 48 bits. Quando um número de sequência clock_seq não é especificado, um inteiro positivo pseudoaleatório de 14 bits é gerado.

Se node ou clock_seq excederem a contagem de bits esperada, apenas seus bits menos significativos serão mantidos.

uuid.uuid3(namespace, name)

Gera um UUID com base no hash MD5 de um identificador de espaço de nomes (que é um UUID) e um nome (que é um objeto bytes ou uma string que será codificada usando UTF-8) de acordo com RFC 9562, §5.3.

uuid.uuid4()

Gera um UUID aleatório em um método criptograficamente seguro de acordo com RFC 9562, §5.4.

uuid.uuid5(namespace, name)

Gera um UUID com base no hash SHA-1 de um identificador de espaço de nomes (que é um UUID) e um nome (que é um objeto bytes ou uma string que será codificada usando UTF-8) de acordo com RFC 9562, §5.5.

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

Gera um UUID a partir de um número de sequência e hora atual de acordo com RFC 9562, §5.6.

Esta é uma alternativa ao uuid1() para melhorar a localidade do banco de dados.

Quando node não é especificado, getnode() é usado para obter o endereço de hardware como um inteiro positivo de 48 bits. Quando um número de sequência clock_seq não é especificado, um inteiro positivo pseudoaleatório de 14 bits é gerado.

Se node ou clock_seq excederem a contagem de bits esperada, apenas seus bits menos significativos serão mantidos.

Adicionado na versão 3.14.

uuid.uuid7()

Gera um UUID baseado em tempo de acordo com RFC 9562, §5.7.

Para portabilidade entre plataformas sem precisão de submilissegundos, os UUIDs produzidos por esta função incorporam um registro de data e hora de 48 bits e usam um contador de 42 bits para garantir a monotonicidade dentro de um milissegundo.

Adicionado na versão 3.14.

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

Gera um UUID pseudoaleatório de acordo com RFC 9562, §5.8.

Quando especificados, espera-se que os parâmetros a, b e c sejam inteiros positivos de 48, 12 e 62 bits, respectivamente. Se excederem a contagem de bits esperada, apenas os bits menos significativos serão mantidos; argumentos não especificados são substituídos por um inteiro pseudoaleatório de tamanho apropriado.

Por padrão, a, b e c não são gerados por um gerador de números pseudoaleatórios criptograficamente seguro (CSPRNG). Use uuid4() quando um UUID precisar ser usado em um contexto de segurança sensível.

Adicionado na versão 3.14.

O módulo uuid define os seguintes identificadores de espaço de nomes para uso com uuid3() ou uuid5().

uuid.NAMESPACE_DNS

Quando esse espaço de nomes é especificado, a string name é um nome de domínio totalmente qualificado.

uuid.NAMESPACE_URL

Quando esse espaço de nomes é especificado, a string name é uma URL.

uuid.NAMESPACE_OID

Quando esse espaço de nomes é especificado, a string name é um OID ISO.

uuid.NAMESPACE_X500

Quando esse espaço de nomes é especificado, a string name é um DN X.500 em DER ou um formato de saída de texto.

O módulo uuid define as seguintes constantes para os valores possíveis do atributo variant:

uuid.RESERVED_NCS

Reservado para compatibilidade com NCS.

uuid.RFC_4122

Especifica o layout do UUID fornecido em RFC 4122. Esta constante é mantida para retrocompatibilidade, mesmo que RFC 4122 tenha sido substituído por RFC 9562.

uuid.RESERVED_MICROSOFT

Reservado para compatibilidade com Microsoft.

uuid.RESERVED_FUTURE

Reservado para definição futura.

O módulo uuid define os valores especiais de UUID Nil e Max:

uuid.NIL

Uma forma especial de UUID que é especificada para ter todos os 128 bits definidos como zero de acordo com RFC 9562, §5.9.

Adicionado na versão 3.14.

uuid.MAX

Uma forma especial de UUID que é especificada para ter todos os 128 bits definidos como um, de acordo com RFC 9562, §5.10.

Adicionado na versão 3.14.

Ver também

RFC 9562 - Um espaço de nomes de URN de identificador universalmente exclusivo (UUID)

Esta especificação define um espaço de nomes de Uniform Resource Name para UUIDs, o formato interno de UUIDs e métodos de geração de UUIDs.

Uso na linha de comando

Adicionado na versão 3.12.

O módulo uuid pode ser invocado como um script na linha de comando:

python -m uuid [-h] [-u {uuid1,uuid3,uuid4,uuid5,uuid6,uuid7,uuid8}] [-n ESPAÇOS-DE-NOME] [-N NOME]

As seguintes opções são aceitas:

-h, --help

Mostra a mensagem de ajuda e sai.

-u <uuid>
--uuid <uuid>

Especifica o nome da função a ser usada para gerar o uuid. Por padrão, uuid4() é usado.

Alterado na versão 3.14: Permite gerar versões 6, 7 e 8 do UUID.

-n <namespace>
--namespace <namespace>

O espaço de nomes é um UUID, ou @ns onde ns é um UUID predefinido bem conhecido endereçado pelo nome do espaço de nomes. Como @dns, @url, @oid e @x500. Necessário apenas para funções uuid3() / uuid5().

-N <name>
--name <name>

O nome usado como parte da geração do uuid. Requerido apenas para funções uuid3() / uuid5().

-C <num>
--count <num>

Gera num novos UUIDs.

Adicionado na versão 3.14.

Exemplo

Aqui estão alguns exemplos de uso típico do módulo 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, 'pyth.onl')
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, 'pyth.onl')
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')

>>> # 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(...)

Exemplo de linha de comando

Aqui estão alguns exemplos de uso típico da interface de linha de comando do uuid:

# gera um UUID aleatório - por padrão uuid4() é usado
$ python -m uuid

# gera um UUID usando uuid1()
$ python -m uuid -u uuid1

# gera um UUID usando uuid5
$ python -m uuid -u uuid5 -n @url -N example.com

# gera 42 UUIDs aleatórios
$ python -m uuid -C 42