Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Java: Общие вопросы > Сравнение файлов |
Автор: lugaru 13.12.2011, 23:54 |
Добрый день! Подскажите как или по каким параметрам можно сравнить два любых файла. Например: в двух папках есть два файла с одинаковым именем но с разными датами изменения, но файлы то могут быть одинаковыми. Вот как узнать что файлы одинаковые? |
Автор: Stolzen 14.12.2011, 00:33 |
Можно перебором. Сначала для каждого файла вычислить хеш, а потом сравнить каждый хеш с каждым - если одинаковые, сравнивать содержимое целиком. |
Автор: Nofate 14.12.2011, 00:34 |
Подсчитать контрольную сумму для начала. |
Автор: lugaru 14.12.2011, 02:09 |
Тогда следующий вопрос, закономерный))) После поисков в интернете наткнулся на хэш коды: MD5, CRC32, SHA-1 Как Вы щитаете что с этого больше подойдет для данной задачи????? |
Автор: Stolzen 14.12.2011, 04:41 |
Да любой берите, если скорость роли не играет. |
Автор: lugaru 14.12.2011, 14:13 | ||
в том от и дело что играет) программа должна работать как сервис, висеть в трее, и не хотелось бы что-бы она лишниее ресурсы использывала |
Автор: ci5 14.12.2011, 14:47 |
2 разных файла могут иметь одинаковый хеш. Что разве другого способа узнать идентичность файлов нету? |
Автор: LSD 14.12.2011, 15:04 |
Сравнить побайтово. |
Автор: lugaru 14.12.2011, 16:19 | ||||
а вот это идея! спасибо |
Автор: _Y_ 14.12.2011, 18:14 |
Ну, для начала, видимо, нужно определить что такое "одинаковые файлы" ![]() ![]() Видимо, предполагается одинаковое содержание и одинаковые имена. Для экономии времени я бы сделал так. 1. Сравниваем имена - 99.99......% сравнений дает "разные" - ответ получен. Об этих файлах больше не беспокоимся 2. У оставщихся сравниваем длину. Отфильтровываем еще 99.99......% 3. Сравниваем что-нибудь-еще. Хэш, конрольную сумму, цвет глаз владельца - отбрасываем еще 99.99......% 4. Оставшиеся сравниваем побайтово - единственный способ дающий полную гарантию. |
Автор: lugaru 14.12.2011, 22:03 | ||
Я себе примерно так и нарисовал, просто думал о какомто унифицированом одном способе))) для меня основная задача стоит например в текстовых файла: название может быть одинаково и размер файла тоже но по содержанию они могу отличаться. |
Автор: _Y_ 14.12.2011, 23:05 |
Кстати, побайтовой сравнение не так страшно как кажется. В качестве модели возьмем два бинарных файла заполненных битами случайным образом. Тогда совпадение первых байтов фалов происходит с вероятностью 2 в степени -8. Совпадение двух первых байтов подряд уже в степени -16 и т.д. Подавляющее большинство пар будет отсеиваться уже на первых нескольких байтах. Понятное дело, что биты в файлах распределены не случайным образом, что увеличит вероятность совпадения. Но все равно до конца пару файлов придется сканировать только в том редчайшем случае если эти файлы идентичны до предпоследнего байта и только последний байт у каждого свой. |
Автор: lugaru 15.12.2011, 00:06 |
спасибо, дали более чем достаточно о чем подумать, байтовое сравнение оставлю на крайний случай. |
Автор: LSD 15.12.2011, 11:40 | ||
Вычисление хеша и так требует полного чтения файлов, можно сразу просто сравнить. |
Автор: Stolzen 15.12.2011, 11:52 | ||
Сравнивать все файлы со всеми целиком? Долго. Лучше в один проход вычислить хеши и потом уже их сравнивать. |
Автор: LSD 15.12.2011, 12:28 | ||||
А как же первый пункт?
|
Автор: _Y_ 15.12.2011, 12:41 | ||||
А я и не настаиваю - просто для примера привел. Выбор конкретных шагов сравнения зависит от конкретной задачи. Я бы, например, в первую очередь сравнивал цвет глаз владелицы файла. Если же у файла не владелица, а владелец, файл бы дальше ни с чем не сравнивался, а отправлялся в мусорку ![]() Я, собственно, просто иллюстрировал основной принцип - более быстрый шаг делается до более медленного. Если предидущий шаг "перекрывает" результаты какого-то из последующих (например, побайтовое сравнение "перекрывает" все что угодно ![]() |
Автор: LSD 15.12.2011, 13:04 | ||
Вычисление 2-х хешей и их сравнение дольше, чем просто бинарное сравнение, вот о чем я писал. Хеши нужны если нужно найти дублирующиеся файлы. |