Hachage aléatoire en Python

100

Quelle est la manière la plus simple de générer un hachage aléatoire (MD5) en Python?

monsieur
la source
1
Aléatoire comme pour quoi que ce soit? Ou pour un objet? Si vous voulez juste un MD5 aléatoire, choisissez simplement quelques nombres.
samoz
Je renomme les fichiers avant de les télécharger et je veux un nom de fichier comme celui-ci: timestamp_randommd5.extension Cheers!
mistero
5
Vous pouvez simplement les renommer en timestamp_randomnumber.ext. Il n'y a vraiment aucune raison pour laquelle md5 (randomnumber) serait meilleur que randomnumber lui-même.
qc
la meilleure réponse pour Python 3 est la dernière import uuid; uuid.uuid().hex stackoverflow.com/a/20060712/3218806
maxbellec

Réponses:

131

Un hachage md5 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. Peut-être devriez-vous expliquer pourquoi vous en avez besoin ...

qc
la source
+1 pour ne pas calculer un hachage relativement coûteux à partir d'un nombre aléatoire: cette approche est 5 fois plus rapide.
Nicolas Dumazet
11
+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.
Jiri
1
l'appel random.seed () est inutile, plus ou moins.
tzot le
2
J'aurais utilisé os.urandom parce que vouloir un hachage MD5 pourrait signifier vouloir un hachage sécurisé.
Inconnu
9
Voici comment procéder avec os.urandom:''.join('%02x' % ord(x) for x in os.urandom(16))
FogleBird
98

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 est une chaîne hexadécimale au lieu de renvoyer un objet uuid.

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

sebs
la source
44

Cela fonctionne pour python 2.x et 3.x

import os
import binascii
print(binascii.hexlify(os.urandom(16)))
'4a4d443679ed46f7514ad6dbe3733c3d'
Boutons840
la source
2
Cette méthode d'encodage hexadécimal ne fonctionne plus dans Python 3.
Caramdir le
1
Merci. c'est la meilleure façon de créer une clé de hachage aléatoire.
Jake
7
fonctionne pour 2.x et 3.x: binascii.hexlify (os.urandom (16))
Clay
44

Le secretsmodule a été ajouté dans Python 3.6+. Il fournit des valeurs aléatoires sécurisées par cryptographie en un seul appel. Les fonctions prennent un nbytesargument facultatif , la valeur par défaut est de 32 (octets * 8 bits = jetons de 256 bits). MD5 a des hachages de 128 bits, alors fournissez 16 pour les jetons «de type MD5».

>>> import secrets

>>> secrets.token_hex(nbytes=16)
'17adbcf543e851aa9216acc9d7206b96'

>>> secrets.token_urlsafe(16)
'X7NYIolv893DXLunTzeTIQ'

>>> secrets.token_bytes(128 // 8)
b'\x0b\xdcA\xc0.\x0e\x87\x9b`\x93\\Ev\x1a|u'
Nick T
la source
19

Encore une autre approche. 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 flexibilité sur la longueur de la corde.

>>> random_string(64)
'XTgDkdxHK7seEbNDDUim9gUBFiheRLRgg7HyP18j6BZU5Sa7AXiCHP1NEIxuL2s0'
Matthew Taylor
la source
Je changerais probablement string.letters en «abcdf» pour refléter les chiffres hexadécimaux. Mais excellente solution!
ranchalp
''.join(random.sample(string.ascii_letters + string.digits, 8))plus pythonique?
404pio le
6

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 réponse; juste que c'est une autre approche :)

tzot
la source
5
import uuid
from md5 import md5

print md5(str(uuid.uuid4())).hexdigest()
Sam
la source
2
import os, hashlib
hashlib.md5(os.urandom(32)).hexdigest()
gizzmole
la source
0
from hashlib import md5
plaintext = input('Enter the plaintext data to be hashed: ') # Must be a string, doesn't need to have utf-8 encoding
ciphertext = md5(plaintext.encode('utf-8').hexdigest())
print(ciphertext)

Il convient également de noter que MD5 est une fonction de hachage très faible, des collisions ont également été trouvées (deux valeurs de texte brut différentes donnent le même hachage) Utilisez simplement une valeur aléatoire pour plaintext.

Eric Jin
la source
Exiger l'entrée de l'utilisateur n'aide pas avec l'aspect "le plus simple" de la question originale ...
AS Mackay
Avez-vous vérifié votre code? Il manque un paren sur la ligne 3.
ingyhere