Qual è il modo più semplice per generare un hash casuale (MD5) in Python?
import uuid; uuid.uuid().hex
stackoverflow.com/a/20060712/3218806
Qual è il modo più semplice per generare un hash casuale (MD5) in Python?
import uuid; uuid.uuid().hex
stackoverflow.com/a/20060712/3218806
Risposte:
Un hash md5 è solo un valore a 128 bit, quindi se ne vuoi uno casuale:
import random
hash = random.getrandbits(128)
print("hash value: %032x" % hash)
Non vedo davvero il punto, però. Forse dovresti spiegare perché hai bisogno di questo ...
os.urandom
:''.join('%02x' % ord(x) for x in os.urandom(16))
Penso che quello che stai cercando sia un identificatore univoco universale, quindi l'UUID del modulo in python è quello che stai cercando.
import uuid
uuid.uuid4().hex
UUID4 ti fornisce un identificatore univoco casuale che ha la stessa lunghezza di una somma md5. Hex rappresenterà è come una stringa esadecimale invece di restituire un oggetto uuid.
Funziona sia per python 2.x che per 3.x
import os
import binascii
print(binascii.hexlify(os.urandom(16)))
'4a4d443679ed46f7514ad6dbe3733c3d'
Il secrets
modulo è stato aggiunto in Python 3.6+. Fornisce valori casuali protetti crittograficamente con una singola chiamata. Le funzioni accettano un nbytes
argomento opzionale , il valore predefinito è 32 (byte * 8 bit = token a 256 bit). MD5 ha hash a 128 bit, quindi fornisci 16 per i token "simili 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'
Ancora un altro approccio. Non dovrai formattare un int per ottenerlo.
import random
import string
def random_string(length):
pool = string.letters + string.digits
return ''.join(random.choice(pool) for i in xrange(length))
Offre flessibilità sulla lunghezza della corda.
>>> random_string(64)
'XTgDkdxHK7seEbNDDUim9gUBFiheRLRgg7HyP18j6BZU5Sa7AXiCHP1NEIxuL2s0'
''.join(random.sample(string.ascii_letters + string.digits, 8))
più pitonico?
Un altro approccio a questa domanda specifica:
import random, string
def random_md5like_hash():
available_chars= string.hexdigits[:16]
return ''.join(
random.choice(available_chars)
for dummy in xrange(32))
Non sto dicendo che sia più veloce o preferibile a qualsiasi altra risposta; solo che è un altro approccio :)
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)
Va anche notato che MD5 è una funzione hash molto debole, inoltre sono state trovate collisioni (due diversi valori di testo in chiaro producono lo stesso hash) Usa semplicemente un valore casuale per plaintext
.