He estado tratando de encontrar un más python el modo de generar la cadena aleatoria en python que se puede escalar así. Normalmente, veo algo similar a

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

Es una mierda si desea generar cadena larga.

He estado pensando acerca de azar.getrandombits por un tiempo, y averiguar cómo convertir a una matriz de bits, a continuación, hex codificar. Usando python 2.6, me topé con la bitarray objeto, que no está documentado. De alguna manera yo tengo que trabajar, y parece que realmente rápido.

Genera un 50mil cadena aleatoria en mi notebook, en apenas 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 se trata de un número impar de caracteres causando el problema. Nuevo código añadido para asegurarse de que siempre se envía fromhex un número par de dígitos hexadecimales.

Todavía curiosidad de saber si hay una mejor manera de hacer esto que es tan rápido.

  • ¿Cómo puedo hacer para que sólo incluya números, letras, y subrayado? (Esto incluye un guión)
  • for i in xrange(longitud))
InformationsquelleAutor mikelikespie | 2009-04-24

5 Comentarios

  1. 130
    import os
    random_string = os.urandom(string_length)

    y si usted necesita la url de cadena segura :

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

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

    • Ah! Tan simple. Yo no creo que fue la cruz-plataforma, pero al parecer lo es.
    • Sólo un seguimiento, es realmente extraño, pero al menos en OS X, el getrandbits método es 2-3 veces más rápido.
    • Eso es probablemente porque os.urandom será un criptográficamente segura PRNG (generalmente un sistema de cifrado de flujo) mientras que el azar es un «normal» PRNG que son generalmente de manera más rápida de calcular.
    • Hay una manera de usar esto para generar cadenas de caracteres ASCII en lugar de unicode? Por ejemplo, por lo que la cadena puede ser utilizado en una dirección URL.
    • Usted podría utilizar al azar.elección de la cadena.dígitos, y la cadena.letras como en el primer ejemplo: >>> import random, cadena >>> «.join(al azar.elección(de la cadena.letras + cadena.dígitos) for i in xrange(10)) ‘FywhcRLmh1’ (estoy asumiendo que usted no está generando una enorme cadena, como el op ya que es para una dirección URL…)
    • Para la Url de uno lo desea, puede utilizar string.ascii_letters.
    • Usted puede codificar la cadena aleatoria en base64 para una dirección url.
    • Específicamente, la he usado: base64.urlsafe_b64encode(os.urandom(30))
    • Lo siento por volver a publicar en un hilo viejo. ¿Hay alguna forma de usar os.urandom(string_length) y obtener ASCII sólo letras? … Como python es un lenguaje interpretado, el bucle que genera un byte a la vez parece bastante costoso.
    • jricher le dio una solución para que el que devuelve una cadena codificada en base64, que es: ASCII sólo letras.

  2. 10

    A veces un uuid es lo suficientemente corto y si no te gustan los guiones siempre se puede.replace(‘-‘, «) les

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

    Si quieres que sea de una longitud específica sin guiones

    random_string_length = 16
    str(uuid4()).replace('-', '')[:random_string_length]
    • o uso uuid4().hex para obtener el valor sin guiones
  3. 2

    Parece que el fromhex() método espera un número par de dígitos hexadecimales. La cadena es de 75 caracteres.
    Ser conscientes de que something[:-1] excluye el último elemento! Sólo uso something[:].

    • Hubo un trailing L con el __hex__(). He reescrito el código de ejemplo. De todos modos, creo que estaban en lo correcto con lo que requieren un número par de dígitos
  4. 2

    Respecto al último ejemplo, la siguiente revisión para asegurarse de que la línea es aún longitud, cualquiera que sea el junk_len valor:

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

Dejar respuesta

Please enter your comment!
Please enter your name here