Límite máximo de bytes en la actualización del método del módulo Hashlib Python

Estoy tratando de calcular el hash md5 de un archivo con la función hashlib.md5 () del módulo hashlib.

Así que escribí esta pieza de código:

Buffer = 128 f = open("c:\\file.tct", "rb") m = hashlib.md5() while True: p = f.read(Buffer) if len(p) != 0: m.update(p) else: break print m.hexdigest() f.close() 

Noté que la actualización de la función es más rápida si incremento el valor de la variable Buffer con 64, 128, 256 y así sucesivamente. ¿Hay un límite superior que no puedo superar? Supongo que podría ser sólo un problema de memoria RAM, pero no lo sé.

Los tamaños de trozos grandes (≈ 2**40 ) conducen a MemoryError , es decir, no hay otro límite que no sea la RAM disponible. Por otro lado, bufsize está limitado por 2**31-1 en mi máquina:

 import hashlib from functools import partial def md5(filename, chunksize=2**15, bufsize=-1): m = hashlib.md5() with open(filename, 'rb', bufsize) as f: for chunk in iter(partial(f.read, chunksize), b''): m.update(chunk) return m 

Big chunksize puede ser tan lento como uno muy pequeño. Mídelo.

Me parece que para los archivos de ≈ 10 MB, el tamaño de 2**15 es el más rápido para los archivos que he probado.

Para poder manejar archivos arbitrariamente grandes, necesita leerlos en bloques. El tamaño de dichos bloques debe ser preferiblemente una potencia de 2, y en el caso de md5, el bloque mínimo posible consiste en 64 bytes (512 bits), ya que los bloques de 512 bits son las unidades en las que opera el algoritmo.

Pero si vamos más allá y tratamos de establecer un criterio exacto si, por ejemplo, el bloque de 2048 bytes es mejor que el bloque de 4096 bytes … probablemente fallaremos. Esto debe probarse y medirse con mucho cuidado, y casi siempre el valor se elige a voluntad, a juzgar por la experiencia.

El valor del búfer es el número de bytes que se leen y almacenan en la memoria a la vez, así que sí, el único límite es su memoria disponible.

Sin embargo, los valores más grandes no son automáticamente más rápidos. En algún momento, es posible que tenga problemas de paginación en la memoria u otras disminuciones de velocidad con la asignación de memoria si el búfer es demasiado grande. Debe experimentar con valores cada vez más grandes hasta que scope los rendimientos decrecientes de velocidad.