884 votes

Comment créer un GUID/UUID en Python ?

Comment créer un GUID en Python qui soit indépendant de la plate-forme ? J'ai entendu dire qu'il existait une méthode utilisant ActivePython sous Windows, mais elle est réservée à Windows car elle utilise COM. Existe-t-il une méthode utilisant Python pur ?

57 votes

Pour l'amour de tout ce qui est sacré, c'est un UUID - Universal Unique ID. fr.wikipedia.org/wiki/Universally_unique_identifier - C'est juste que malheureusement MS a préféré le GUID.

9 votes

Voici une réplique pour vous : python -c 'import uuid; print(uuid.uuid4())'

1075voto

stuartd Points 22668

En module uuid fournit des objets UUID immuables (la classe UUID) et les fonctions uuid1() , uuid3() , uuid4() , uuid5() pour générer des UUIDs de version 1, 3, 4 et 5 comme spécifié dans RFC 4122 .

Si tout ce que vous voulez est un ID unique, vous devriez probablement appeler uuid1() o uuid4() . Notez que uuid1() peut compromettre la confidentialité puisqu'il crée un UUID contenant l'adresse réseau de l'ordinateur. uuid4() crée un UUID aléatoire.

Docs :

Exemples (pour Python 2 et 3) :

>>> import uuid

>>> # make a random UUID
>>> uuid.uuid4()
UUID('bd65600d-8669-4903-8a14-af88203add38')

>>> # Convert a UUID to a string of hex digits in standard form
>>> str(uuid.uuid4())
'f50ec0b7-f960-400d-91f0-c42a6d44e3d0'

>>> # Convert a UUID to a 32-character hexadecimal string
>>> uuid.uuid4().hex
'9fe2c4e93f654fdbb24c02b15259716c'

39 votes

Jetez également un coup d'œil à la shortuuid que j'ai écrit, car il vous permet de générer des UUID plus courts et lisibles : github.com/stochastic-technologies/shortuuid

2 votes

@StavrosKorokithakis : avez-vous écrit le module shortuuid pour Python 3.x par hasard ?

2 votes

@JayPatel Est-ce que shortuuid ne fonctionne pas pour Python 3 ? Si ce n'est pas le cas, veuillez enregistrer un bogue.

340voto

Jay Points 20373

Si vous utilisez Python 2.5 ou une version ultérieure, l'option module uuid est déjà inclus dans la distribution standard de Python.

Ex :

>>> import uuid
>>> uuid.uuid4()
UUID('5361a11b-615c-42bf-9bdb-e2c3790ada14')

153voto

Copié de : https://docs.python.org/3/library/uuid.html (Puisque les liens postés n'étaient pas actifs et qu'ils sont constamment mis à jour)

>>> 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')

29voto

Chris Dutrow Points 8662

J'utilise les GUID comme clés aléatoires pour les opérations de type base de données.

La forme hexadécimale, avec les tirets et les caractères supplémentaires, me semble inutilement longue. Mais j'aime aussi le fait que les chaînes représentant des nombres hexadécimaux sont très sûres dans la mesure où elles ne contiennent pas de caractères pouvant poser des problèmes dans certaines situations, tels que '+', '=', etc.

Au lieu de l'hexadécimal, j'utilise une chaîne base64 sécurisée par url. Ce qui suit n'est pas conforme à une quelconque spécification UUID/GUID (autre que d'avoir la quantité requise d'aléatoire).

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('=', '')

3 votes

Si vous n'avez pas l'intention de l'utiliser dans des contextes UUID, vous pouvez tout simplement utiliser random.getrandbits(128).to_bytes(16, 'little') ou (pour le crypto-aléatoire) os.urandom(16) et obtenir un total de 128 bits d'aléatoire (UUIDv4 utilise 6-7 bits sur l'info de version). Ou bien vous pouvez n'utiliser que 15 octets (en perdant 1 à 2 bits d'aléatoire par rapport à UUIDv4) et éviter d'avoir à couper les informations suivantes = tout en réduisant également la taille codée à 20 octets (de 24, rognés à 22), car tout multiple de 3 octets est codé en #bytes / 3 * 4 caractères en base64, sans remplissage.

0 votes

@ShadowRanger Oui, c'est en gros l'idée. 128 bits aléatoires, aussi courts que possible, tout en étant sûrs pour les URL. L'idéal serait de n'utiliser que des lettres majuscules et minuscules, puis des chiffres. Donc je suppose une chaîne de base-62.

0 votes

Lorsque j'utilise votre fonction, j'obtiens une erreur de type de la part de l'utilisateur. return qui s'attend à un objet de type octet. Il peut être corrigé avec return str(r_uuid).replace('=','') .

11voto

Mobasshir Bhuiyan Points 343

Si vous avez besoin de passer l'UUID pour une clé primaire pour votre modèle ou un champ unique, le code ci-dessous renvoie l'objet UUID -.

 import uuid
 uuid.uuid4()

Si vous avez besoin de passer l'UUID en tant que paramètre pour l'URL, vous pouvez faire comme le code ci-dessous.

import uuid
str(uuid.uuid4())

Si vous voulez la valeur hexagonale d'un UUID, vous pouvez faire ce qui suit -

import uuid    
uuid.uuid4().hex

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X