Существует хорошее обсуждение переполнения стека вычислительных хэшей файлов , включая файлы, слишком большие для размещения в памяти, в Python ( 1 , 2 , 3 ).В итоге они получают решения, которые выглядят примерно так (слегка отредактировано от # 3):
def md5_file(path, size):
m = hashlib.md5()
with open(path, 'rb') as f:
b = f.read(size)
while len(b) > 0:
m.update(b)
b = f.read(size)
return m.digest()
Если вам не нужна криптографически безопасная хэш-функция (чего я не делаю), тогда есть pyfasthash (по-видимому, также известный как pyhash), как обсуждено здесь .К сожалению, в хеш-классах pyfasthash отсутствует метод update
, использованный выше.У меня не было большой удачи, чтобы понять, что еще делать;смесь кода Python-C вне меня.Я просто читаю весь файл в память следующим образом:
with open(path, 'rb') as afile:
return hasher(afile.read())
Недостатки этого подхода:
- Файл должен уместиться в памяти
- Это медленнее.В соответствии с # 3 вы хотите, чтобы объем загружаемого вами в память файла был достаточно мал, чтобы избежать подкачки страниц (около 64 КБ на компьютере автора плаката).
Isесть ли способ быстрее вычислить хэши моих файлов?