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



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



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



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

758   2  

2 ответов:

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

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

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

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

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

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

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

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

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

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

Comments

    Ничего не найдено.