Эффективный хэш больших файлов по сети с использованием Python - PullRequest
2 голосов
/ 13 марта 2012

Я хочу сравнить два файла в двух разных сетевых расположениях.Файлы могут иметь размер несколько ГБ, и иногда местоположение файла может быть разделено медленной глобальной сетью.

Я знаю, как генерировать хэши SHA1 в Python, но я слышал о методе, с помощью которого можно хэшировать несколько файлов.частей, в отличие от всего файла, затем сравните хэши частей.Например, 64 КБ от начала, «середины» и конца каждого файла.Это законный метод?Как это можно сделать?

Ответы [ 2 ]

2 голосов
/ 13 марта 2012

Загрузить только часть файла, используя

req = urllib2.Request(url)
req.headers['Range'] = 'bytes=%s-%s' % (start, end)
f = urllib2.urlopen(req)

Затем вы можете хешировать загружаемую часть:

s = f.read()
hashlib.sha1(s).hexdigest()

Конечно, чтобы убедиться, что файл эквивалентен, вам нужно хешировать каждую часть файла.

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

возможно, вы думаете о хеш-списках или хеш-деревьях , которые можно использовать для уменьшения скорости передачи данных (например, в бит-торренте)?к сожалению, они отличаются от того, что вы помните, несколькими способами:

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

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

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

...