Ich suche nach einer sehr schnellen Möglichkeit, eine alphanumerische eindeutige ID für einen Primärschlüssel in einer Tabelle zu generieren.
Würde so etwas funktionieren?
def genKey():
hash = hashlib.md5(RANDOM_NUMBER).digest().encode("base64")
alnum_hash = re.sub(r'[^a-zA-Z0-9]', "", hash)
return alnum_hash[:16]
Was wäre ein guter Weg, um Zufallszahlen zu generieren? Wenn ich es auf Mikrozeit stütze, muss ich die Möglichkeit von mehreren Aufrufen von genKey () gleichzeitig aus verschiedenen Instanzen berücksichtigen.
Oder gibt es einen besseren Weg, dies alles zu tun?
Antworten:
Da keine der Antworten eine zufällige Zeichenfolge enthält, die aus den Zeichen 0-9, az, AZ besteht: Hier ist eine funktionierende Lösung, die Ihnen eine von ca. 62 ^ 16 = 4,76724 e + 28 Tasten:
import random, string x = ''.join(random.choice(string.ascii_uppercase + string.ascii_lowercase + string.digits) for _ in range(16)) print(x)
Es ist auch sehr gut lesbar, ohne die ASCII-Codes auswendig zu kennen.
Es gibt eine noch kürzere Version seit
python 3.6.2
:import random, string x = ''.join(random.choices(string.ascii_letters + string.digits, k=16)) print(x)
quelle
Sie können dies verwenden:
>>> import random >>> ''.join(random.choice('0123456789ABCDEF') for i in range(16)) 'E2C6B2E19E4A7777'
Es gibt keine Garantie dafür, dass die generierten Schlüssel eindeutig sind. Sie sollten daher bereit sein, einen neuen Schlüssel erneut zu verwenden, falls die ursprüngliche Einfügung fehlschlägt. Möglicherweise möchten Sie auch einen deterministischen Algorithmus verwenden, um eine Zeichenfolge aus einer automatisch inkrementierten ID zu generieren, anstatt zufällige Werte zu verwenden, da dies Ihnen die Eindeutigkeit garantiert (aber auch vorhersehbare Schlüssel liefert).
quelle
os.urandom
nicht pseudo-zufällig?os.urandom
ist immer noch pseudozufällig, aber kryptografisch sicher pseudozufällig, was es für eine Vielzahl von Anwendungsfällen im Vergleich zu viel besser geeignet machtrandom
.get_key = lambda n: n % 10
ist deterministisch, aber nicht lange einzigartig.Schauen Sie sich das UUID-Modul (Python 2.5+) an.
Ein kurzes Beispiel:
>>> import uuid >>> uid = uuid.uuid4() >>> uid.hex 'df008b2e24f947b1b873c94d8a3f2201'
Beachten Sie, dass das OP nach einer 16-stelligen alphanumerischen Zeichenfolge gefragt hat, die UUID4-Zeichenfolgen jedoch 32 Zeichen lang sind. Sie sollten diese Zeichenfolge nicht abschneiden, sondern die vollständigen 32 Zeichen verwenden.
quelle
In Python 3.6, das im Dezember 2016 veröffentlicht wurde, wurde das
secrets
Modul eingeführt.Sie können jetzt ein zufälliges Token auf folgende Weise generieren:
import secrets secrets.token_hex(16)
Aus den Python-Dokumenten:
https://docs.python.org/3/library/secrets.html
quelle
Für Zufallszahlen ist eine gute Quelle
os.urandom
:>> import os >> import hashlib >> random_data = os.urandom(128) >> hashlib.md5(random_data).hexdigest()[:16]
quelle
>>> import random >>> ''.join(random.sample(map(chr, range(48, 57) + range(65, 90) + range(97, 122)), 16)) 'CDh0geq3NpKtcXfP'
quelle
''.join(random.choice(string.ascii_uppercase + string.ascii_lowercase + string.digits) for _ in range(6666))
Dieser Wert wird bei jedem Aufruf um 1 erhöht (er wird umbrochen). Die Entscheidung, wo der Wert am besten gespeichert werden soll, hängt davon ab, wie Sie ihn verwenden. Diese Erklärung ist möglicherweise von Interesse, da hier nicht nur die Funktionsweise von Guids, sondern auch die Erstellung einer kleineren erläutert wird.
Die kurze Antwort lautet wie folgt: Verwenden Sie einige dieser Zeichen als Zeitstempel und die anderen Zeichen als "Eindeutigkeit". Bei jedem Aufruf Ihres UID-Generators wird der Wert um 1 erhöht.
quelle
Verwenden Sie einfach Python Builtin UUID:
Wenn UUIDs für Ihre Zwecke in Ordnung sind, verwenden Sie das integrierte UUID- Paket.
Einzeilige Lösung:
>>> import uuid >>> str(uuid.uuid4().get_hex().upper()[0:16]) '40003A9B8C3045CA'
quelle
einfach verwenden Python eingebaute uuid :
import uuid print uuid.uuid4().hex[:16].upper()
quelle
Sie können die Auswahlfunktion in np.random verwenden, mit der die Anzahl der angegebenen Zeichen aus einer Liste von Zeichen ausgewählt wird:
import numpy as np chars = np.array(list('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789')) np_codes = np.random.choice(chars,16) print(''.join([val for val in np_codes]))
Dies gibt ungefähr Folgendes aus:
591FXwW61F4Q57av
quelle