chaînes aléatoires en Python 2.6 (Est-ce OK?)
-
16-09-2019 - |
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.
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]
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")