126 votes

Le moyen le plus léger de créer une chaîne aléatoire et un nombre hexadécimal aléatoire

Quel est le moyen le plus léger de créer une chaîne aléatoire de 30 caractères comme celle-ci?

ufhy3skj5nca0d2dfh9hwd2tbk9sw1

Et un nombre hexadécimal de 30 chiffres comme le suivant?

8c6f78ac23b4a7b8c0182d7a89e9b1

143voto

jcdyer Points 7956

J'ai un plus rapide pour la sortie hexadécimale. En utilisant les mêmes t1 et t2 que ci-dessus:

 >>> t1 = timeit.Timer("''.join(random.choice(string.hexdigits) for n in xrange(30))", "import random, string")
>>> t2 = timeit.Timer("binascii.b2a_hex(os.urandom(15))", "import os, binascii")
>>> t3 = timeit.Timer("'%030x' % random.randrange(16**30)", "import random")
>>> for t in t1, t2, t3:
...     t.timeit()
... 
28.165037870407104
9.0292739868164062
5.2836320400238037
 

t3 n'effectue qu'un seul appel vers le module aléatoire, il n'est pas nécessaire de créer ou de lire une liste, puis effectue le reste avec le formatage de chaîne.

97voto

wump Points 2499

Chaîne hexagonale à 30 chiffres:

 >>> import os,binascii
>>> print binascii.b2a_hex(os.urandom(15))
"c84766ca4a3ce52c3602bbf02ad1f7"
 

L'avantage est que cela devient aléatoire directement à partir du système d'exploitation, ce qui peut être plus sécurisé et / ou plus rapide que random (), et vous n'avez pas à le semer.

35voto

joefis Points 727
import string
import random
lst = [random.choice(string.ascii_letters + string.digits) for n in xrange(30)]
str = "".join(lst)
print str
ocwbKCiuAJLRJgM1bWNV1TPSH0F2Lb

17voto

yaronf Points 53

Remarque: random.choice(string.hexdigits) est incorrect, car string.hexdigits renvoie 0123456789abcdefABCDEF (en minuscule et en majuscule), vous obtiendrez donc un résultat biaisé, avec le chiffre hexadécimal 'c' deux fois plus susceptibles d'apparaître que le chiffre «7». À la place, utilisez simplement random.choice('0123456789abcdef') .

4voto

David Narayan Points 1550

Incidemment, cela résulte de l'utilisation de timeit sur les deux approches suggérées:

Utilisation de random.choice() :

 >>> t1 = timeit.Timer("''.join(random.choice(string.hexdigits) for n in xrange(30))", "import random, string")
>>> t1.timeit()
69.558588027954102
 

Utilisation de binascii.b2a_hex() :

 >>> t2 = timeit.Timer("binascii.b2a_hex(os.urandom(15))", "import os, binascii")
>>> t2.timeit()
16.288421154022217
 

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