124 votes

Hachage aléatoire en Python

Quel est le le plus facile Comment générer un hash aléatoire (MD5) en Python ?

1 votes

Aléatoire comme pour n'importe quoi ? Ou pour un objet ? Si vous voulez juste un MD5 aléatoire, choisissez simplement des chiffres.

0 votes

Je renomme les fichiers avant de les télécharger et je veux un nom de fichier comme celui-ci : timestamp_randommd5.extension Merci !

6 votes

Vous pourriez simplement les renommer en timestamp_randomnumber.ext. Il n'y a vraiment aucune raison pour que md5(randomnumber) soit meilleur que randomnumber lui-même.

160voto

sth Points 91594

Un md5-hash est juste une valeur de 128 bits, donc si vous voulez une valeur aléatoire :

import random

hash = random.getrandbits(128)

print("hash value: %032x" % hash)

Je ne vois pas vraiment l'intérêt, cependant. Vous devriez peut-être expliquer pourquoi vous en avez besoin...

1 votes

+1 pour ne pas calculer un hachage relativement coûteux à partir d'un nombre aléatoire : cette approche est 5 fois plus rapide.

12 votes

+1 - c'est sûrement mieux que ma réponse, peut être utilisé aussi comme ceci : hex(random.getrandbits(128))[2:-1] cela vous donne le même résultat que la méthode md5 hexdigest.

1 votes

L'appel random.seed() est plus ou moins inutile.

131voto

sebs Points 635

Je pense que ce que vous recherchez est un identifiant unique universel, alors le module UUID en python est ce que vous recherchez.

import uuid
uuid.uuid4().hex

UUID4 vous donne un identifiant unique aléatoire qui a la même longueur qu'une somme md5. Hex représentera l'identifiant sous forme de chaîne hexadécimale au lieu de renvoyer un objet uuid.

http://docs.python.org/2/library/uuid.html

48voto

Buttons840 Points 1656

Cela fonctionne aussi bien pour python 2.x que pour python 3.x.

import os
import binascii
print(binascii.hexlify(os.urandom(16)))
'4a4d443679ed46f7514ad6dbe3733c3d'

2 votes

Cette méthode de codage hexadécimal ne fonctionne plus dans Python 3.

1 votes

Merci. C'est la meilleure façon de créer une clé de hachage aléatoire.

7 votes

Fonctionne pour 2.x et 3.x : binascii.hexlify(os.urandom(16))

24voto

Matthew Taylor Points 886

Une autre approche encore. Vous n'aurez pas à formater un int pour l'obtenir.

import random
import string

def random_string(length):
    pool = string.letters + string.digits
    return ''.join(random.choice(pool) for i in xrange(length))

Vous donne une certaine flexibilité sur la longueur de la corde.

>>> random_string(64)
'XTgDkdxHK7seEbNDDUim9gUBFiheRLRgg7HyP18j6BZU5Sa7AXiCHP1NEIxuL2s0'

2 votes

Je changerais probablement string.letters en 'abcdf' pour refléter les chiffres hexadécimaux. Mais c'est une excellente solution !

0 votes

''.join(random.sample(string.ascii_letters + string.digits, 8)) plus pythoniques ?

0 votes

string.ascii_letters pour python 3 au lieu de string.letters

6voto

tzot Points 32224

Une autre approche de cette question spécifique :

import random, string

def random_md5like_hash():
    available_chars= string.hexdigits[:16]
    return ''.join(
        random.choice(available_chars)
        for dummy in xrange(32))

Je ne dis pas que c'est plus rapide ou préférable à toute autre solution, mais c'est juste que c'est un autre approche :)

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