Как найти все файлы с одинаковым содержанием? - PullRequest
3 голосов
/ 08 ноября 2010

Это вопрос для собеседования : «Если в каталоге много файлов, найдите файлы с одинаковым содержанием».Я бы предложил использовать хеш-функцию для генерации хеш-значений содержимого файла и сравнения только файлов с одинаковыми хеш-значениями.Имеет ли это смысл ?

Следующий вопрос - как выбрать хеш-функцию.Вы бы использовали SHA-1 для этой цели?

Ответы [ 4 ]

6 голосов
/ 08 ноября 2010

Я бы предпочел использовать хеш в качестве второго шага.Сортировка dir по размеру файла и хэширование и сравнение только при наличии дублирующих размеров может значительно улучшить вашу поисковую единицу в общем случае.

4 голосов
/ 08 ноября 2010

Как и большинство вопросов на собеседовании, это больше предназначено для того, чтобы зажечь разговор, чем иметь один ответ.

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

Я бы начал с гораздо более быстрой и простой хэш-функции, чем SHA-1.SHA-1 криптографически безопасен, что не обязательно требуется в этом случае.В моих неофициальных тестах Adler 32, например, работает в 2-3 раза быстрее.Вы также можете использовать более слабый предполагаемый тест, чем повторно тестировать любые файлы, которые соответствуют.Это решение также зависит от соотношения между пропускной способностью ввода-вывода и мощностью ЦП. Если у вас более мощный ЦП, используйте более конкретный хеш, чтобы сэкономить необходимость перечитывать файлы в последующих тестах, если у вас более быстрый ввод-вывод, повторные чтения могут быть дешевле, чем выполнениедорогие хеши излишне.

Другой интересной идеей будет использование эвристики для файлов при их обработке для определения оптимального метода на основе размера файлов, скорости компьютера и энтропии файла.

2 голосов
/ 08 ноября 2010

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

1 голос
/ 08 ноября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...