¿Cuál es la forma más sencilla de generar un hash aleatorio (MD5) en Python?
import uuid; uuid.uuid().hex
stackoverflow.com/a/20060712/3218806
¿Cuál es la forma más sencilla de generar un hash aleatorio (MD5) en Python?
import uuid; uuid.uuid().hex
stackoverflow.com/a/20060712/3218806
Respuestas:
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 ...
os.urandom
:''.join('%02x' % ord(x) for x in os.urandom(16))
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.
Esto funciona tanto para python 2.xy 3.x
import os
import binascii
print(binascii.hexlify(os.urandom(16)))
'4a4d443679ed46f7514ad6dbe3733c3d'
El secrets
módulo se agregó en Python 3.6+. Proporciona valores aleatorios criptográficamente seguros con una sola llamada. Las funciones toman un nbytes
argumento 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'
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'
''.join(random.sample(string.ascii_letters + string.digits, 8))
más pitónico?
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 :)
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
.