Как я могу создать несколько хэшей файла, используя только один проход? - PullRequest
6 голосов
/ 11 февраля 2009

Как я могу получить MD5, SHA и другие хэши из файла, но только за один проход? У меня есть файлы по 100 МБ, поэтому я не хотел бы обрабатывать эти файлы по 100 МБ несколько раз.

Ответы [ 3 ]

15 голосов
/ 11 февраля 2009

Что-то вроде этого возможно?

>>> import hashlib
>>> hashes = (hashlib.md5(), hashlib.sha1())
>>> f = open('some_file', 'r')
>>> for line in f:
...     for hash in hashes:
...         hash.update(line)
... 
>>> for hash in hashes:
...     print hash.name, hash.hexdigest()

или цикл по f.read (1024) или что-то в этом роде, чтобы получить блоки фиксированной длины

8 голосов
/ 11 февраля 2009

Вот модифицированный ответ @ʞɔıu , используя @Jason S 'предложение .

from __future__ import with_statement
from hashlib import md5, sha1

filename = 'hash_one-pass.py'

hashes = md5(), sha1()
chunksize = max(4096, max(h.block_size for h in hashes))
with open(filename, 'rb') as f:
    while True:
        chunk = f.read(chunksize)
        if not chunk:
            break
        for h in hashes:
            h.update(chunk)

for h in hashes:
    print h.name, h.hexdigest()
3 голосов
/ 11 февраля 2009

Я не знаю Python, но я знаком с хэш-вычислениями.

Если вы обрабатываете чтение файлов вручную, просто читайте по одному блоку (по 256 байт или 4096 байт или что-то еще) за раз и передавайте каждый блок данных, чтобы обновить хэш каждого алгоритма. (вам нужно инициализировать состояние в начале и завершить состояние в конце.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...