Если вам действительно нужно гарантировать 100% 100% идентичность файлов, вам необходимо выполнить побайтовое сравнение. Это как раз и влечет за собой проблему — единственный метод хеширования с нулевым риском ложного совпадения — это функция тождества!
Что нам осталось, так это ярлыки, которые могут быстро дать нам быстрые ответы и позволить нам пропустить побайтовое сравнение в некоторых случаях.
Как правило, единственным способом доказательства равенства является подтверждение тождества. В объектно-ориентированном коде это будет показывать два объекта, хотя на самом деле это один и тот же объект. Самое близкое в файлах - это если привязка или соединение NTFS означают, что два пути ведут к одному и тому же файлу. Это случается так редко, что, если характер работы не делает ее более обычной, чем обычно, это не будет чистой прибылью для проверки.
Таким образом, у нас остается короткий путь к поиску несоответствий. Ничего не делает для увеличения наших проходов, но ускоряет наши неудачи:
- Разный размер, не побайтно равный. Простые!
- Если вы будете проверять один и тот же файл более одного раза, хешируйте его и запишите хэш. Разный хэш, гарантированно не равный. Сокращение файлов, требующих прямого сравнения, огромно.
- Многие форматы файлов, вероятно, имеют некоторые общие области. В частности, первые байты для многих форматов имеют тенденцию быть «магическими числами», заголовками и т. Д. Либо пропустите их, либо пропустите затем, а затем проверьте последним (если есть вероятность того, что они разные, но это мало).
Затем нужно сделать фактическое сравнение как можно быстрее. Загрузка пакетов из 4 октетов за раз в целое число и выполнение целочисленного сравнения часто будет быстрее, чем октет на октет.
Трединг может помочь. Один из способов состоит в том, чтобы разделить фактическое сравнение файла на несколько операций, но, если возможно, больший выигрыш можно получить, выполняя совершенно разные сравнения в разных потоках. Мне нужно знать немного больше о том, что вы делаете, чтобы много советовать, но главное - убедиться, что выходные данные тестов потокобезопасны.
Если у вас есть более одного потока, исследующего одни и те же файлы, пусть они работают далеко друг от друга. Например. если у вас четыре потока, вы можете разбить файл на четыре, или вы можете сделать так, чтобы один принимал байты 0, 4, 8, а другой — байты 1, 5, 9 и т. д. (или 4-октетная группа 0, 4, 8 и т. д. ). В последнем гораздо чаще возникают проблемы с ложным обменом, чем в первом, поэтому не делайте этого. .
Редактировать:
Это также зависит от того, что вы делаете с файлами. Вы говорите, что вам нужна 100% уверенность, поэтому этот бит не относится к вам, но стоит добавить для более общей проблемы, что если стоимость ложного срабатывания - это пустая трата ресурсов, времени или памяти, а не фактический сбой , то уменьшение его с помощью нечеткого короткого пути может быть чистой победой, и, возможно, стоит профилировать, чтобы увидеть, так ли это.
Если вы используете хэш для ускорения работы (по крайней мере, он может быстрее находить определенные несоответствия), тогда Spooky Hash Боба Дженкинса — хороший выбор; он не является криптографически безопасным, но если это не является вашей целью, он очень быстро создает 128-битный хэш (намного быстрее, чем криптографический хэш или даже чем подходы, применяемые во многих реализациях GetHashCode()
), которые чрезвычайно хороши для предотвращения случайных коллизий (т. другое дело — преднамеренные коллизии, которых избегают криптографические хэши). Я реализовал его для .Net и поместил его в nuget, потому что ни у кого больше не было, когда я обнаружил, что хочу использовать его.
person
Jon Hanna
schedule
24.08.2012
not 100% match the two files with the same hash
Вы уверены? Знаете ли вы MD5, SHA2, SHA-224, SHA-256, SHA-384, SHA-512? и их вероятности? - person L.B   schedule 25.08.2012