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
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
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.
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.
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')
.
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 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.