stringhe casuali in Python 2.6 (è questo bene?)
-
16-09-2019 - |
Domanda
Ho cercato di trovare un modo più divinatorio di generare stringa casuale in python in grado di scalare pure. In genere, vedo qualcosa di simile a
''.join(random.choice(string.letters) for i in xrange(len))
Si fa schifo, se si desidera generare lunga serie.
Ho pensato a random.getrandombits per un po ', e capire come convertire che, per una serie di bit, quindi hex codificare questo. Utilizzando Python 2.6 mi sono imbattuto l'oggetto BitArray, che non è documentato. In qualche modo ho preso a lavorare, e sembra veramente veloce.
Si genera una stringa casuale 50mil sul mio notebook in soli circa 3 secondi.
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]
modifica
heikogerlach ha sottolineato che si trattava di un numero dispari di caratteri che causano il problema. Il nuovo codice aggiunto per assicurarsi che sempre inviato fromhex un numero pari di cifre esadecimali.
Ancora curioso di sapere se c'è un modo migliore di fare questo che è altrettanto veloce.
Soluzione
import os
random_string = os.urandom(string_length)
e se avete bisogno url stringa sicura:
import os
random_string = os.urandom(string_length).hex()
(nota lunghezza random_string è maggiore rispetto string_length in quel caso)
Altri suggerimenti
A volte un uuid è abbastanza breve, e se non vi piacciono i trattini è possibile always.replace ( '-', '') li
from uuid import uuid4
random_string = str(uuid4())
Se si vuole che un determinato periodo senza trattini
random_string_length = 16
str(uuid4()).replace('-', '')[:random_string_length]
Tratto da bug report 1.023.290 a Python.org:
junk_len = 1024
junk = (("%%0%dX" % junk_len) % random.getrandbits(junk_len *
8)).decode("hex")
Sembra che il metodo di fromhex()
si aspetta un numero pari di cifre esadecimali. La stringa è lungo 75 caratteri.
Essere consapevoli che something[:-1]
esclude l'ultimo elemento! Basta usare something[:]
.
Per quanto riguarda l'ultimo esempio, la seguente correzione per assicurarsi che la linea è anche la lunghezza, qualunque sia il valore junk_len:
junk_len = 1024
junk = (("%%0%dX" % (junk_len * 2)) % random.getrandbits(junk_len * 8)).decode("hex")