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 semblable à
''.join(random.choice(string.letters) for i in xrange(len))
Il suce si vous voulez générer longue chaîne.
Que j'ai pensé au hasard.getrandombits pendant un certain temps, et de comprendre comment convertir un tableau de bits, puis en hexadécimal coder ça. À 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.
- Comment puis-je faire de cette manière qu'il peut uniquement contenir des lettres, des chiffres et le trait de soulignement? (Ce qui comprend un tableau de bord)
- for i in xrange(longueur))
Vous devez vous connecter pour publier un commentaire.
et si vous avez besoin d'url sécurité de la chaîne :
(note random_string longueur est plus grande que string_length dans ce cas)
string.ascii_letters
.os.urandom(string_length)
et d'obtenir des lettres ASCII seulement? ... Que python est un langage interprété, la boucle qui génère un octet à la fois semble assez coûteux.Parfois un uuid est assez courte, et si vous n'aimez pas les tirets, vous pouvez toujours.replace('-', ") leur
Si vous souhaitez une longueur spécifique sans les tirets
uuid4().hex
pour obtenir la valeur, sans traits d'unionPrises à partir de la Million vingt trois mille deux cent quatre vingt dix rapport de bug à Python.org:
Aussi, voir les questions Neuf cent vingt trois mille six cent quarante trois et Million vingt trois mille deux cent quatre vingt dix
Il semble que le
fromhex()
méthode 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! Utilisez simplementsomething[:]
.Concernant le dernier exemple, le correctif suivant pour vous assurer que la ligne est même longueur, quelle que soit la junk_len valeur: