1266 Stimmen

Wie man eine GUID/UUID in Python erstellt

Wie kann ich eine GUID in Python erstellen, die plattformunabhängig ist? Ich habe gehört, dass es eine Methode gibt, die ActivePython unter Windows verwendet, aber sie ist nur für Windows geeignet, weil sie COM verwendet. Gibt es eine Methode mit einfachem Python?

88 Stimmen

Um Himmels willen, es ist eine UUID - Universal Unique ID de.wikipedia.org/wiki/Universell_eindeutiger_Bezeichner - nur leider hat MS die GUID bevorzugt.

15 Stimmen

Hier ist ein Text für Sie: python -c 'import uuid; print(uuid.uuid4())'

1561voto

stuartd Punkte 65785

El uuid-Modul bietet unveränderliche UUID-Objekte (die UUID-Klasse) und die Funktionen uuid1() , uuid3() , uuid4() , uuid5() für die Erzeugung von UUIDs der Versionen 1, 3, 4 und 5, wie in RFC 4122 .

Wenn Sie nur eine eindeutige ID wollen, sollten Sie wahrscheinlich uuid1() o uuid4() . なお uuid1() kann die Privatsphäre gefährden, da es eine UUID erstellt, die die Netzwerkadresse des Computers enthält. uuid4() erzeugt eine zufällige UUID.

UUID-Versionen 6 und 7 - neue Universally Unique Identifier (UUID)-Formate für den Einsatz in modernen Anwendungen und Datenbanken ( Entwurf ) rfc - sind erhältlich bei https://pypi.org/project/uuid6/

Dokumente:

Beispiele (sowohl für Python 2 als auch für 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'

54 Stimmen

Werfen Sie auch einen Blick auf die shortuuid Modul, das ich geschrieben habe, da es Ihnen ermöglicht, kürzere, lesbare UUIDs zu erzeugen: github.com/stochastic-technologies/shortuuid

4 Stimmen

@StavrosKorokithakis: haben Sie shortuuid Modul für Python 3.x durch einen Zufall geschrieben?

3 Stimmen

@JayPatel Funktioniert shortuuid nicht für Python 3? Wenn nicht, bitte einen Fehler melden.

373voto

Jay Punkte 40418

Wenn Sie Python 2.5 oder höher verwenden, wird die uuid-Modul ist bereits in der Python-Standarddistribution enthalten.

Ex:

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

166voto

Kopiert von: https://docs.python.org/3/library/uuid.html (Da die geposteten Links nicht aktiv waren und sie sich ständig aktualisieren)

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

32voto

Chris Dutrow Punkte 45374

Ich verwende GUIDs als Zufallsschlüssel für datenbankartige Operationen.

Die hexadezimale Form mit den Bindestrichen und zusätzlichen Zeichen erscheint mir unnötig lang. Mir gefällt aber auch, dass Zeichenketten, die hexadezimale Zahlen darstellen, sehr sicher sind, da sie keine Zeichen enthalten, die in manchen Situationen Probleme verursachen können, wie z. B. "+", "=" usw..

Anstelle von Hexadezimalzahlen verwende ich eine url-sichere base64-Zeichenkette. Die folgende Zeichenkette entspricht jedoch keiner UUID/GUID-Spezifikation (außer der erforderlichen Zufälligkeit).

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

4 Stimmen

Wenn Sie sich nicht die Mühe machen wollen, sie in einem UUID-Kontext zu verwenden, können Sie auch einfach random.getrandbits(128).to_bytes(16, 'little') oder (für Krypto-Zufälligkeit) os.urandom(16) und erhalten volle 128 Bits an Zufallsinformationen (UUIDv4 verwendet 6-7 Bits an Versionsinformationen). Oder verwenden Sie nur 15 Bytes (verlieren Sie 1-2 Bits an Zufallsinformationen im Vergleich zu UUIDv4) und vermeiden Sie die Notwendigkeit, die Versionsinformationen abzuschneiden. = Zeichen und reduziert gleichzeitig die kodierte Größe auf 20 Bytes (von 24, auf 22 gekürzt), da jedes Vielfache von 3 Bytes zu #bytes / 3 * 4 base64-Zeichen ohne Auffüllungen erforderlich.

0 Stimmen

@ShadowRanger Ja, das ist im Grunde die Idee. 128 zufällige Bits, so kurz wie möglich, und gleichzeitig URL-sicher. Idealerweise würde es nur Groß- und Kleinbuchstaben und dann Zahlen verwenden. Ich schätze also eine Basis-62-Zeichenkette.

1 Stimmen

Wenn ich Ihre Funktion verwende, erhalte ich einen Typfehler von der return Anweisung, die ein byteähnliches Objekt erwartet. Dies kann mit return str(r_uuid).replace('=','') .

16voto

Mobasshir Bhuiya Punkte 768

Wenn Sie UUID für einen Primärschlüssel für Ihr Modell oder ein eindeutiges Feld übergeben müssen, gibt der folgende Code das UUID-Objekt zurück -

 import uuid
 uuid.uuid4()

Wenn Sie die UUID als Parameter für die URL übergeben müssen, können Sie den folgenden Code verwenden -

import uuid
str(uuid.uuid4())

Wenn Sie den hexadezimalen Wert für eine UUID benötigen, können Sie wie folgt vorgehen -

import uuid    
uuid.uuid4().hex

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X