Con python 2.7 il codice seguente calcola l'esadecimale mD5 del contenuto di un file.Utilizzo di hashlib per calcolare il digest md5 di un file in Python 3
(MODIFICA: beh, non proprio come hanno dimostrato le risposte, l'ho solo pensato).
import hashlib
def md5sum(filename):
f = open(filename, mode='rb')
d = hashlib.md5()
for buf in f.read(128):
d.update(buf)
return d.hexdigest()
Ora, se corro che il codice usando python3 si solleva un'eccezione TypeError:
d.update(buf)
TypeError: object supporting the buffer API required
ho capito che avrei potuto fare che eseguire codice con entrambe python2 e python3 cambiarlo con:
def md5sum(filename):
f = open(filename, mode='r')
d = hashlib.md5()
for buf in f.read(128):
d.update(buf.encode())
return d.hexdigest()
Ora mi chiedo ancora perché il codice originale ha smesso di funzionare. Sembra che aprendo un file usando il modificatore della modalità binaria restituisca interi invece di stringhe codificate come byte (lo dico perché type (buf) restituisce int). Questo comportamento è spiegato da qualche parte?
correlato: http://stackoverflow.com/q/4949162/ – jfs
Sarebbe più veloce se avete fatto grande legge, più vicino alla dimensione del blocco del file del file system? (Per esempio 1024 byte su ext3 Linux e 4096 byte o più di Windows NTFS) – rakslice