Como criar um GUID / UUID em Python
-
22-08-2019 - |
Pergunta
Como faço para criar um GUID em Python que é independente de plataforma? Ouvi dizer que há um método usando ActivePython no Windows, mas é somente para Windows porque ele usa COM. Existe um método utilizando plain Python?
Solução
O módulo uuid, em Python 2,5 ou superior, proporciona UUID compatível com RFC geração. Veja a documentação do módulo e do RFC para mais detalhes. [ fonte ]
Docs:
- Python 2: http://docs.python.org/2/library/uuid .html
- Python 3: https://docs.python.org/3/library/uuid.html
Exemplo (trabalhando em 2 e 3):
>>> import uuid
>>> uuid.uuid4()
UUID('bd65600d-8669-4903-8a14-af88203add38')
>>> str(uuid.uuid4())
'f50ec0b7-f960-400d-91f0-c42a6d44e3d0'
>>> uuid.uuid4().hex
'9fe2c4e93f654fdbb24c02b15259716c'
Outras dicas
Se você estiver usando o Python 2.5 ou posterior, a uUID módulo já está incluído na distribuição padrão do Python.
Ex:
>>> import uuid
>>> uuid.uuid4()
UUID('5361a11b-615c-42bf-9bdb-e2c3790ada14')
Copiado de: https://docs.python.org/2/library/uuid.html (Uma vez que os links postados não estavam ativos e mantêm atualização)
>>> 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
'\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')
Eu uso GUIDs como chaves aleatórias para operações do tipo de banco de dados.
A forma hexadecimal, com os traços e caracteres extras parecem desnecessariamente longo para mim. Mas eu também gosto que strings representando números hexadecimais são muito seguros na medida em que não contêm caracteres que podem causar problemas em algumas situações, como '+', '=', etc ..
Em vez de hexadecimal, eu uso uma string base64 url-safe. O seguinte não se conforma com qualquer UUID / spec GUID embora (além de ter a quantidade necessária de aleatoriedade).
import base64
import uuid
# get a UUID - URL safe, Base64
def get_a_uuid():
r_uuid = base64.urlsafe_b64encode(uuid.uuid4().bytes)
return r_uuid.replace('=', '')
Esta função é totalmente configurável e gera uid exclusivo baseado no formato especificado
por exemplo: - [8, 4, 4, 4, 12], isto é o formato mencionado e que irá gerar o seguinte uuid
LxoYNyXe-7hbQ-caJt-DSdU-PDAht56cMEWi
import random as r
def generate_uuid():
random_string = ''
random_str_seq = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
uuid_format = [8, 4, 4, 4, 12]
for n in uuid_format:
for i in range(0,n):
random_string += str(random_str_seq[r.randint(0, len(random_str_seq) - 1)])
if n != 12:
random_string += '-'
return random_string
Se você precisa passar UUID para uma chave primária para o seu modelo ou campo único, então a seguir retorna código do objeto UUID -
import uuid
uuid.uuid4()
Se você precisa passar UUID como parâmetro para a URL que você pode fazer como o código abaixo -
import uuid
str(uuid.uuid4())
Se você deseja que o valor hexadecimal para um UUID que você pode fazer a seguir um -
import uuid
uuid.uuid4().hex