Chaînes aléatoires dans Python 2.6 (Est-ce OK?)



1 Answers

Parfois, un uuid est assez court et si vous n'aimez pas les tirets, vous pouvez toujours les remplacer par '-', '')

from uuid import uuid4

random_string = str(uuid4())

Si vous le voulez une longueur spécifique sans tirets

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

J'ai essayé de trouver une façon plus pythonique de générer une chaîne aléatoire en python qui peut également être mise à l'échelle. Typiquement, je vois quelque chose de similaire à

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

C'est nul si vous voulez générer une longue chaîne.

Je pensais à random.getrandombits depuis un moment, et à trouver comment le convertir en un tableau de bits, puis l'encoder en hexadécimal. En utilisant python 2.6, je suis tombé sur l'objet bitarray, qui n'est pas 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 de 50mil sur mon ordinateur portable en à peu près 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 fait remarquer que c'était un nombre impair de caractères qui causait le problème. Nouveau code ajouté pour s'assurer qu'il envoie toujours de hex un nombre pair de chiffres hexadécimaux.

Toujours curieux de savoir s'il existe une meilleure façon de faire cela, c'est aussi rapide.




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




Related