Ich habe versucht, eine pythonischere Methode zu finden, um zufällige Zeichenfolgen in Python zu generieren, die ebenfalls skaliert werden können. Normalerweise sehe ich etwas Ähnliches
''.join(random.choice(string.letters) for i in xrange(len))
Es ist scheiße, wenn Sie eine lange Zeichenfolge generieren möchten.
Ich habe eine Weile über random.getrandombits nachgedacht und herausgefunden, wie man das in ein Array von Bits konvertiert und dann hexadezimal codiert. Mit Python 2.6 bin ich auf das Bitarray-Objekt gestoßen, das nicht dokumentiert ist. Irgendwie habe ich es zum Laufen gebracht und es scheint sehr schnell zu sein.
In nur 3 Sekunden wird auf meinem Notebook eine zufällige Zeichenfolge von 50 mil generiert.
def rand1(leng):
nbits = leng * 6 + 1
bits = random.getrandbits(nbits)
uc = u"%0x" % bits
newlen = int(len(uc) / 2) * 2 # we have to make the string an even length
ba = bytearray.fromhex(uc[:newlen])
return base64.urlsafe_b64encode(str(ba))[:leng]
bearbeiten
heikogerlach wies darauf hin, dass es eine ungerade Anzahl von Zeichen war, die das Problem verursachten. Neuer Code hinzugefügt, um sicherzustellen, dass immer eine gerade Anzahl von Hex-Ziffern von Hex gesendet wird.
Immer noch neugierig, ob es einen besseren Weg gibt, der genauso schnell ist.
quelle
Antworten:
import os random_string = os.urandom(string_length)
und wenn Sie eine URL-sichere Zeichenfolge benötigen:
import os random_string = os.urandom(string_length).hex()
(Beachten Sie, dass die Länge von random_string in diesem Fall größer als string_length ist.)
quelle
os.urandom(string_length)
nur ASCII-Buchstaben zu verwenden und abzurufen? ... Da Python eine interpretierte Sprache ist, scheint die Schleife, die jeweils ein Byte generiert, ziemlich kostspielig zu sein.Manchmal ist eine UUID kurz genug und wenn Sie die Bindestriche nicht mögen, können Sie sie immer ersetzen ('-', '')
from uuid import uuid4 random_string = str(uuid4())
Wenn Sie eine bestimmte Länge ohne Bindestriche wünschen
random_string_length = 16 str(uuid4()).replace('-', '')[:random_string_length]
quelle
uuid4().hex
, um den Wert ohne Bindestriche zu erhaltenEntnommen aus dem 1023290- Fehlerbericht auf Python.org:
junk_len = 1024 junk = (("%%0%dX" % junk_len) % random.getrandbits(junk_len * 8)).decode("hex")
Siehe auch die Probleme 923643 und 1023290
quelle
Es scheint, dass die
fromhex()
Methode eine gerade Anzahl von Hex-Ziffern erwartet. Ihre Zeichenfolge ist 75 Zeichen lang. Beachten Sie, dasssomething[:-1]
umfasst nicht das letzte Element! Einfach benutzensomething[:]
.quelle
In Bezug auf das letzte Beispiel die folgende Korrektur, um sicherzustellen, dass die Zeile unabhängig vom junk_len-Wert gerade ist:
junk_len = 1024 junk = (("%%0%dX" % (junk_len * 2)) % random.getrandbits(junk_len * 8)).decode("hex")
quelle