Ответ 1
Если вы хотите скорость, не хеш! Особенно это не криптографический хеш, как MD5. Эти хэши сконструированы так, что их невозможно отменить, а не быстро вычислять. То, что вы должны использовать, - это контрольная сумма - см. java.util.zip.Checksum
и две ее конкретные реализации. Adler32 чрезвычайно быстро вычисляет.
Любой метод, основанный на контрольных суммах или хешах, уязвим для коллизий, но вы можете минимизировать риск, используя два разных метода в способе RSYNC.
Алгоритм в основном:
- Проверить размер файлов равными
- Разбить файлы на куски размером N байтов
- Вычислить контрольную сумму для каждой пары соответствующих блоков и сравнить. Любые различия доказывают, что файлы не совпадают.
Это позволяет раннее обнаружение разницы. Вы можете улучшить его, одновременно вычислив две контрольные суммы с помощью разных алгоритмов или разных размеров блоков.
Больше бит в результате означает меньшую вероятность столкновения, но как только вы переходите через 64 бита, вы находитесь вне того, что Java (и процессор компьютера) может обрабатывать изначально и, следовательно, замедляться, поэтому FNV-1024 менее вероятен чтобы дать вам ложный ответ, но гораздо медленнее.
Если речь идет о скорости, просто используйте Adler32 и согласитесь, что очень редко разница не будет обнаружена. Это действительно редко. Такие контрольные суммы используются для того, чтобы Интернет мог выявить ошибки передачи, и как часто вы получаете неправильные данные?
Это все о точности действительно, вам придется сравнивать каждый байт. Ничто другое не будет работать.
Если вы можете пойти на компромисс между скоростью и точностью, есть множество вариантов.