Cadenas aleatorias en Python 2.6 (¿Está bien?)

He estado tratando de encontrar una forma más pirónica de generar cadenas aleatorias en Python que también puedan escalar. Típicamente, veo algo similar a

''.join(random.choice(string.letters) for i in xrange(len)) 

Apesta si quieres generar una cadena larga.

He estado pensando en random.getrandombits por un tiempo, y descubriendo cómo convertir eso en una matriz de bits, luego codificarlo por hexadecimal. Usando python 2.6 encontré el objeto bitarray, que no está documentado. De alguna manera lo hice funcionar, y parece muy rápido.

Genera una secuencia aleatoria de 50 mil en mi portátil en solo 3 segundos.

 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] 

editar

heikogerlach señaló que era un número impar de caracteres el que causaba el problema. Se agregó un nuevo código para asegurarse de que siempre envíe desde hexágonos un número par de dígitos hexadecimales

Todavía tengo curiosidad por saber si hay una mejor manera de hacer esto con la misma rapidez.

 import os random_string = os.urandom(string_length) 

y si necesita url cadena segura:

 import os random_string = os.urandom(string_length).hex() 

(nota que la longitud de random_string es mayor que string_length en ese caso)

A veces, un uuid es lo suficientemente corto y si no te gustan los guiones, siempre puedes reubicarlos (‘-‘, ”)

 from uuid import uuid4 random_string = str(uuid4()) 

Si quieres una longitud específica sin guiones.

 random_string_length = 16 str(uuid4()).replace('-', '')[:random_string_length] 

Tomado del informe de error 1023290 en Python.org:

 junk_len = 1024 junk = (("%%0%dX" % junk_len) % random.getrandbits(junk_len * 8)).decode("hex") 

Ver también los números 923643 y 1023290.

Parece que el método fromhex() espera un número par de dígitos hexadecimales. Tu cadena tiene 75 caracteres. ¡Ten en cuenta que something[:-1] excluye el último elemento! Solo usa something[:] .

Con respecto al último ejemplo, la siguiente solución para asegurarse de que la línea tenga una longitud uniforme, sea cual sea el valor de junk_len:

 junk_len = 1024 junk = (("%%0%dX" % (junk_len * 2)) % random.getrandbits(junk_len * 8)).decode("hex")