Hash aleatorio en Python

100

¿Cuál es la forma más sencilla de generar un hash aleatorio (MD5) en Python?

mistero
fuente
1
¿Aleatorio como en cualquier cosa? ¿O por un objeto? Si solo desea un MD5 aleatorio, elija algunos números.
Samoz
Estoy cambiando el nombre de los archivos antes de cargarlos y quiero un nombre de archivo como este: timestamp_randommd5.extension ¡Salud!
mistero
5
Puede simplemente cambiarles el nombre a timestamp_randomnumber.ext. Realmente no hay una razón por la que md5 (número aleatorio) sea mejor que el propio número aleatorio.
algo
la mejor respuesta para Python 3 es la última import uuid; uuid.uuid().hex stackoverflow.com/a/20060712/3218806
maxbellec

Respuestas:

131

Un hash md5 es solo un valor de 128 bits, por lo que si desea uno aleatorio:

import random

hash = random.getrandbits(128)

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

Sin embargo, realmente no veo el punto. Tal vez deberías explicar por qué necesitas esto ...

algo
fuente
+1 por no calcular un hash relativamente caro a partir de un número aleatorio: este enfoque es 5 veces más rápido.
Nicolas Dumazet
11
+1 - seguramente esto es mejor que mi respuesta, también se puede usar así: hex (random.getrandbits (128)) [2: -1] esto le da el mismo resultado que el método md5 hexdigest.
Jiri
1
la llamada random.seed () es inútil, más o menos.
tzot
2
Yo habría usado os.urandom porque querer un hash MD5 podría significar querer uno seguro.
Desconocido
9
He aquí cómo hacerlo con os.urandom:''.join('%02x' % ord(x) for x in os.urandom(16))
FogleBird
97

Creo que lo que estás buscando es un identificador único universal, entonces el UUID del módulo en python es lo que estás buscando.

import uuid
uuid.uuid4().hex

UUID4 le proporciona un identificador único aleatorio que tiene la misma longitud que una suma md5. Hex representará como una cadena hexadecimal en lugar de devolver un objeto uuid.

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

sebs
fuente
44

Esto funciona tanto para python 2.xy 3.x

import os
import binascii
print(binascii.hexlify(os.urandom(16)))
'4a4d443679ed46f7514ad6dbe3733c3d'
Botones840
fuente
2
Esta forma de codificación hexadecimal ya no funciona en Python 3.
Caramdir
1
Gracias. esta es la mejor manera de hacer una clave hash aleatoria.
Jake
7
funciona para 2.xy 3.x: binascii.hexlify (os.urandom (16))
Clay
44

El secretsmódulo se agregó en Python 3.6+. Proporciona valores aleatorios criptográficamente seguros con una sola llamada. Las funciones toman un nbytesargumento opcional , el valor predeterminado es 32 (bytes * 8 bits = tokens de 256 bits). MD5 tiene hashes de 128 bits, así que proporcione 16 para los tokens "similares a 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
fuente
19

Otro enfoque más. No tendrá que formatear un int para obtenerlo.

import random
import string

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

Le da flexibilidad en la longitud de la cuerda.

>>> random_string(64)
'XTgDkdxHK7seEbNDDUim9gUBFiheRLRgg7HyP18j6BZU5Sa7AXiCHP1NEIxuL2s0'
Matthew Taylor
fuente
Probablemente cambiaría string.letters a 'abcdf' para reflejar dígitos hexadecimales. ¡Pero gran solución!
ranchalp
''.join(random.sample(string.ascii_letters + string.digits, 8))más pitónico?
404pio
6

Otro enfoque para esta pregunta específica:

import random, string

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

No digo que sea más rápido o preferible a cualquier otra respuesta; solo que es otro enfoque :)

tzot
fuente
5
import uuid
from md5 import md5

print md5(str(uuid.uuid4())).hexdigest()
Sam
fuente
2
import os, hashlib
hashlib.md5(os.urandom(32)).hexdigest()
gizzmole
fuente
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)

También debe tenerse en cuenta que MD5 es una función hash muy débil, también se han encontrado colisiones (dos valores de texto plano diferentes dan como resultado el mismo hash). Solo use un valor aleatorio para plaintext.

Eric Jin
fuente
Requerir la entrada del usuario no ayuda con el aspecto "más fácil" de la pregunta original ...
AS Mackay
¿Revisaste tu código? Falta un par en la línea 3.
ingyhere