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.

È stato utile?

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

Inoltre, vedere i problemi 923.643 e 1.023.290

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")
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top