Получите хеш MD5 больших файлов в Python

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

, Другими словами, если это возможно, способствуют этому стилю

return a > 0 ?
  positively(a):
  negatively(a);

по этому

if (a > 0)
  return positively(a);
else
  return negatively(a);

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

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

183
задан Chris 4 May 2015 в 02:29
поделиться

3 ответа

Разбейте файл на 8192-байтовые фрагменты (или другое число, кратное 128 байтам) и последовательно загрузите их в MD5, используя update () .

Это дает преимущество о том, что MD5 имеет 128-байтовые блоки дайджеста (8192 - это 128 × 64). Поскольку вы не читаете весь файл в память, это не займет много больше 8192 байта памяти.

В Python 3.8+ вы можете сделать

import hashlib
with open("your_filename.txt", "rb") as f:
    file_hash = hashlib.md5()
    while chunk := f.read(8192):
        file_hash.update(chunk)
print(file_hash.digest())
print(file_hash.hexdigest())  # to get a printable str instead of bytes
141
ответ дан 23 November 2019 в 05:58
поделиться

Вам нужно читать файл кусками подходящего размера:

def md5_for_file(f, block_size=2**20):
    md5 = hashlib.md5()
    while True:
        data = f.read(block_size)
        if not data:
            break
        md5.update(data)
    return md5.digest()

ПРИМЕЧАНИЕ. Убедитесь, что вы открываете файл с помощью rb, иначе вы получите неверный результат.

Итак, чтобы сделать все одним методом - используйте что-то вроде:

def generate_file_md5(rootdir, filename, blocksize=2**20):
    m = hashlib.md5()
    with open( os.path.join(rootdir, filename) , "rb" ) as f:
        while True:
            buf = f.read(blocksize)
            if not buf:
                break
            m.update( buf )
    return m.hexdigest()

Вышеупомянутое обновление было основано на комментариях, предоставленных Фрерихом Раабе - и я проверил это и обнаружил, что он верен на моих окнах Python 2.7.2 установка

Я перепроверил результаты с помощью инструмента 'jacksum'.

jacksum -a md5 <filename>

http://www.jonelo.de/java/jacksum/

220
ответ дан 23 November 2019 в 05:58
поделиться

Вы не можете получить его md5, не прочитав полное содержимое. но вы можете использовать функцию update для чтения содержимого файлов блок за блоком.
m.update (а); m.update (b) эквивалентен m.update (a + b)

1
ответ дан 23 November 2019 в 05:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: