77 votes

Des chaînes aléatoires en Python 2.6 (est-ce OK ?)

J'ai essayé de trouver un plus pythonic moyen de génération aléatoire de la chaîne de caractères en python qui peut évoluer aussi bien. Généralement, je vois quelque chose de similaire à

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

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

J'ai pensé au hasard.getrandombits pendant un certain temps, et de comprendre comment convertir un tableau de bits, puis en hexadécimal encoder. À l'aide de python 2.6, je suis tombé sur le bitarray objet, qui n'est pas documenté. En quelque sorte je l'ai eu à travailler, et il semble vraiment rapide.

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

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é que c'était un nombre impair de caractères à l'origine du problème. Nouveau code ajouté à assurez-vous toujours envoyé fromhex un même nombre de chiffres hexadécimaux.

Toujours curieux de savoir si il ya une meilleure façon de faire qui est tout aussi rapide.

129voto

Seun Osewa Points 3243
import os
random_string = os.urandom(string_length)

10voto

Joelbitar Points 409

Parfois un uuid est assez court et si vous n’aimez pas les tirets vous pouvez always.replace ('-', '') eux

Si vous souhaitez une longueur spécifique sans tirets

6voto

fdr Points 153

Extraits du rapport de bogue de 1023290 à Python.org :

Consultez également les questions 923643 et 1023290

2voto

user115995 Points 21

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X