Question

J'ai essayé de trouver un moyen plus pythonique de générer chaîne aléatoire en python qui peut évoluer aussi bien. En général, je vois quelque chose de similaire à

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

Il suce si vous voulez générer longue chaîne.

J'ai pensé à random.getrandombits pendant un certain temps, et trouver comment convertir en un tableau de bits, puis hex encode que. En utilisant Python 2.6 je suis tombé sur l'objet BitArray, non documenté. D'une certaine façon, je l'ai eu à travailler, et il semble vraiment rapide.

Il génère une chaîne aléatoire sur mon ordinateur portable 50mil en seulement 3 secondes.

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]

modifier

heikogerlach a souligné qu'il était un nombre impair de caractères l'origine du problème. Nouveau code ajouté pour vous assurer qu'il toujours envoyé fromhex un nombre pair de chiffres hexadécimaux.

Toujours curieux de savoir s'il y a une meilleure façon de faire ce qui est tout aussi rapide.

Était-ce utile?

La solution

import os
random_string = os.urandom(string_length)

et si vous avez besoin url chaîne sûre:

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

(note de longueur random_string est plus grand que string_length dans ce cas)

Autres conseils

Parfois, un UUID est assez courte et si vous ne voulez pas les tirets, vous pouvez always.replace ( « - », « ») les

from uuid import uuid4

random_string = str(uuid4())

Si vous voulez une longueur spécifique sans tirets

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

Tiré du bug 1023290 rapport à Python.org:

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

En outre, voir les problèmes 923643 et 1023290

Il semble que la méthode fromhex() attend un nombre pair de chiffres hexadécimaux. Votre chaîne est de 75 caractères. Sachez que something[:-1] exclut le dernier élément! Il suffit d'utiliser something[:].

En ce qui concerne le dernier exemple, le correctif suivant pour vous assurer que la ligne est même longueur, quelle que soit la valeur junk_len:

junk_len = 1024
junk =  (("%%0%dX" % (junk_len * 2)) % random.getrandbits(junk_len * 8)).decode("hex")
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top