проверка контрольной суммы python двух больших файлов - PullRequest
1 голос
/ 21 марта 2012

Я пытаюсь создать контрольную сумму из двух файлов, чтобы сравнить их. Это скрипт, который я использую:

import hashlib
import datetime
f = open('myfile.mov', 'rb')
def checkF(f, block_size=2**20):
...     print datetime.datetime.now()
...     h = hashlib.sha1()
...     while True:
...             data = f.read(block_size)
...             if not data:
...                     break
...             h.update(data)
...     print datetime.datetime.now()
...     return h.digest()
... 
>>> checkF(f)
2012-03-21 09:33:40.704032
2012-03-21 09:33:40.704490
'\xda9\xa3\xee^kK\r2U\xbf\xef\x95`\x18\x90\xaf\xd8\x07\t'

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

Ответы [ 3 ]

3 голосов
/ 21 марта 2012

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

Чтобы получить хеш-сумму в виде шестнадцатеричной строки (для потребления человеком), просто наберите h.hexdigest() вместо h.digest(), который возвращает хэш-сумму в виде строки байтов (более компактной, но не читаемой человеком).

0 голосов
/ 21 марта 2012

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

0 голосов
/ 21 марта 2012
>>> '\xda9\xa3\xee^kK\r2U\xbf\xef\x95`\x18\x90\xaf\xd8\x07\t'.encode('hex')
'da39a3ee5e6b4b0d3255bfef95601890afd80709'

Но вы, вероятно, хотите просто использовать hexdigest() вместо

...