Что состоит в том, чтобы проверить самый быстрый хеш-алгоритм, равны ли два файла?

Я рекомендую FindBugs. http://findbugs.sourceforge.net/ Хороший в помощи сделать обзор кода.

58
задан Jon Seigel 17 May 2010 в 04:25
поделиться

7 ответов

Один из подходов может заключаться в использовании простого алгоритма CRC-32, и только если значения CRC равны, повторно запустить хэш с SHA1 или чем-то более надежным. Быстрый CRC-32 превзойдет криптографически безопасный хэш в любой день.

25
ответ дан 24 November 2019 в 18:55
поделиться

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

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

  • Сравнить размеры
  • Сравнить даты (будьте осторожны: это может дать вам неправильный ответ; вы должны проверить, подходит ли это вам или нет)
  • Сравнить хеши

Это позволяет быстро сбой (если размеры разные, вы знаете, что файлы разные).

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

47
ответ дан 24 November 2019 в 18:55
поделиться

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

В противном случае CRC является очень простым алгоритмом.

2
ответ дан 24 November 2019 в 18:55
поделиться

Для приложений этого типа Adler32 , вероятно, является самым быстрым алгоритмом с разумным уровнем безопасности. Для файлов большего размера вы можете вычислить несколько значений хеш-функции, например, по одному на блок из 5 МБ файла, что снижает вероятность ошибок (т.е. случаев, когда хеш-коды одинаковы, но содержимое файла различается). Кроме того, эта установка значений нескольких хешей может позволить вычисление хеша быть реализованным в многопоточном режиме.

Изменить : (Следуя замечанию Стивена Судита)
Предупреждение, если файлы маленькие !
"Криптографические" свойства Adler32, или, скорее, его недостатки хорошо известны, особенно для коротких сообщений. По этой причине предлагаемое решение следует избегать для файлов размером менее нескольких килобайт.
Тем не менее, в вопросе OP явно ищет быстрый алгоритм и не заботится о безопасности . Более того, стремление к скорости может правдоподобно означать, что вы имеете дело с «большими» файлами , а не с маленькими. В этом контексте Adler32, возможно, применяемый параллельно для фрагментов файлов размером, скажем, 5 МБ, остается очень верным ответом. Alder32 известен своей простотой и скоростью. Кроме того, его надежность, хотя и ниже, чем у CRC такой же длины, вполне приемлема для сообщений размером более 4000 байт.

3
ответ дан 24 November 2019 в 18:55
поделиться

Почему вы хотите его хешировать?

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

Изменить: Этот ответ был опубликован до того, как в вопросе было указано что-либо о сети. Он просто спросил о сравнении двух файлов. Теперь, когда я знаю, что между файлами есть сетевой переход, я бы сказал, просто используйте хеш MD5 и покончите с ним.

1
ответ дан 24 November 2019 в 18:55
поделиться

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

3
ответ дан 24 November 2019 в 18:55
поделиться

вы можете проверить алгоритм, который используют разработчики samba / rsync. Я не рассматривал это подробно, но вижу, что об этом все время упоминают. видимо это неплохо.

0
ответ дан 24 November 2019 в 18:55
поделиться
Другие вопросы по тегам:

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