Подтвердить что ты не робот

"Быстрая" хэш-функция, реализованная в Java, сравнивая часть файла

Мне нужно сравнить два разных файла экземпляра "Файл" на Java и сделать это с помощью быстрой хэш-функции.

Идея: - Хеширование 20 первых строк в файле 1 - Хеширование 20 первых строк в файле 2 - Сравните два хэша и верните true, если они равны.

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

4b9b3361

Ответ 1

Если вы хотите скорость, не хеш! Особенно это не криптографический хеш, как MD5. Эти хэши сконструированы так, что их невозможно отменить, а не быстро вычислять. То, что вы должны использовать, - это контрольная сумма - см. java.util.zip.Checksum и две ее конкретные реализации. Adler32 чрезвычайно быстро вычисляет.

Любой метод, основанный на контрольных суммах или хешах, уязвим для коллизий, но вы можете минимизировать риск, используя два разных метода в способе RSYNC.

Алгоритм в основном:

  • Проверить размер файлов равными
  • Разбить файлы на куски размером N байтов
  • Вычислить контрольную сумму для каждой пары соответствующих блоков и сравнить. Любые различия доказывают, что файлы не совпадают.

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

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

Если речь идет о скорости, просто используйте Adler32 и согласитесь, что очень редко разница не будет обнаружена. Это действительно редко. Такие контрольные суммы используются для того, чтобы Интернет мог выявить ошибки передачи, и как часто вы получаете неправильные данные?

Это все о точности действительно, вам придется сравнивать каждый байт. Ничто другое не будет работать.

Если вы можете пойти на компромисс между скоростью и точностью, есть множество вариантов.

Ответ 2

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

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