Con python 2.7 el siguiente código calcula el hexdigest mD5 del contenido de un archivo.Usando hashlib para calcular md5 resumen de un archivo en Python 3
(EDITAR: bueno, realmente no como las respuestas han demostrado, eso pensé).
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()
Ahora si me quedo ese código usando python3 que provocará una excepción TypeError:
d.update(buf)
TypeError: object supporting the buffer API required
me di cuenta de que podía hacer que el código de ejecución tanto con python2 y python3 cambiándolo a:
def md5sum(filename):
f = open(filename, mode='r')
d = hashlib.md5()
for buf in f.read(128):
d.update(buf.encode())
return d.hexdigest()
Ahora todavía me pregunto por qué el código original dejó de funcionar. Parece que al abrir un archivo utilizando el modificador de modo binario, devuelve números enteros en lugar de cadenas codificadas como bytes (lo digo porque el tipo (buf) devuelve int). ¿Este comportamiento se explica en alguna parte?
relacionada: http://stackoverflow.com/q/4949162/ – jfs
¿Sería más rápido si se hizo más grande lee, más cercano al tamaño de bloque de archivos del sistema de archivos? (por ejemplo, 1024 bytes en Linux ext3 y 4096 bytes o más en Windows NTFS) – rakslice