Максимальное ограничение байтов в обновлении метода модуля Hashlib Python

Я пытаюсь вычислить хеш md5 файла с функцией hashlib.md5 () из модуля hashlib.

Чтобы я написал этот фрагмент кода:

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() 

Я заметил, что обновление функции происходит быстрее, если я увеличиваю значение переменной Buffer с помощью 64, 128, 256 и так далее. Существует ли верхний предел, который я не могу превысить? Полагаю, это может быть только проблема с памятью RAM, но я не знаю.

  • неподдерживаемый хеш-тип при установке plone
  • Поиск дубликатов файлов через hashlib?
  • Сравните результат с hexdigest () с строкой
  • импорт _sha в python hashlib
  • Ошибка импорта hashlib с python 2.7, но не с 2.6
  • Использование hashlib для вычисления md5 digest файла в Python 3
  • Запросы подписи HMAC в Python
  • Создание контрольной суммы MD5 файла
  • 3 Solutions collect form web for “Максимальное ограничение байтов в обновлении метода модуля Hashlib Python”

    Большие (≈ 2**40 ) размеры блоков приводят к MemoryError т. MemoryError Нет никакого предела, кроме доступной ОЗУ. С другой стороны, bufsize ограничивается 2**31-1 на моей машине:

     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 

    Большой chunksize может быть столь же медленным, как очень маленький. Измерьте это.

    Я нахожу, что для ≈ 10 МБ файлов 2**15 chunksize является самым быстрым для файлов, которые я тестировал.

    Чтобы иметь возможность обрабатывать произвольно большие файлы, вам нужно их прочитать в блоках. Размер таких блоков должен быть предпочтительно равным 2, а в случае md5 минимально возможный блок состоит из 64 байтов (512 бит), поскольку 512-битные блоки являются единицами, на которых работает алгоритм.

    Но если мы выйдем за это и попытаемся установить точный критерий, скажем, что 2048-байтовый блок лучше, чем 4096-байтовый блок … мы, скорее всего, потерпим неудачу. Это нужно тщательно проверять и измерять, и почти всегда ценность выбирается по желанию, судя по опыту.

    Значение буфера – это количество байтов, которое считывается и сохраняется в памяти сразу, поэтому да, единственным ограничением является ваша доступная память.

    Однако большие значения не будут автоматически быстрее. В какой-то момент вы можете столкнуться с проблемами подкачки памяти или другими замедлениями с распределением памяти, если буфер слишком велик. Вы должны экспериментировать с большими и большими значениями, пока не нажмете уменьшающуюся отдачу в скорости.

    Python - лучший язык программирования в мире.