Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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
Цитата(Stolzen @ 14.12.2011,  04:41)
Да любой берите, если скорость роли не играет.

в том от и дело что играет) 
программа должна работать как сервис, висеть в трее, и не хотелось бы что-бы она лишниее ресурсы использывала

Автор: ci5 14.12.2011, 14:47
2 разных файла могут иметь одинаковый хеш. 
Что разве другого способа узнать идентичность файлов нету? 

Автор: LSD 14.12.2011, 15:04
Цитата(ci5 @  14.12.2011,  15:47 Найти цитируемый пост)
Что разве другого способа узнать идентичность файлов нету?  

Сравнить побайтово.

Автор: Stolzen 14.12.2011, 15:21
Цитата(lugaru @  14.12.2011,  15:13 Найти цитируемый пост)
в том от и дело что играет) 
программа должна работать как сервис, висеть в трее, и не хотелось бы что-бы она лишниее ресурсы использывала 

Тогда перепробуйте все три и выберете наиболее быстрый. 
Можно вообще в качестве хеш-функции использовать размер файла. Или хешить только первые n байт.

Автор: lugaru 14.12.2011, 16:19
Цитата(Stolzen @ 14.12.2011,  15:21)
Цитата(lugaru @  14.12.2011,  15:13 Найти цитируемый пост)
в том от и дело что играет) 
программа должна работать как сервис, висеть в трее, и не хотелось бы что-бы она лишниее ресурсы использывала 

Тогда перепробуйте все три и выберете наиболее быстрый. 
Можно вообще в качестве хеш-функции использовать размер файла. Или хешить только первые n байт.

а вот это идея! спасибо

Автор: _Y_ 14.12.2011, 18:14
Ну, для начала, видимо, нужно определить что такое "одинаковые файлы" smile  Для системы фалы с разными именами разные. Для программы какой-нибудь они одинаковые если у них одинаковое содержание, а для пользователя - зависит от случая smile 

Видимо, предполагается одинаковое содержание и одинаковые имена. Для экономии времени я бы сделал так.
1. Сравниваем имена - 99.99......% сравнений дает "разные" - ответ получен. Об этих файлах больше не беспокоимся
2. У оставщихся сравниваем длину. Отфильтровываем еще  99.99......% 
3. Сравниваем что-нибудь-еще. Хэш, конрольную сумму, цвет глаз владельца - отбрасываем еще  99.99......% 
4. Оставшиеся сравниваем побайтово - единственный способ дающий полную гарантию.

Автор: lugaru 14.12.2011, 22:03
Цитата(_Y_ @ 14.12.2011,  18:14)
Ну, для начала, видимо, нужно определить что такое "одинаковые файлы" smile  ...

Я себе примерно так и нарисовал, просто думал о какомто унифицированом одном способе)))
для меня основная задача стоит например в текстовых файла: название может быть одинаково и размер файла тоже но по содержанию они могу отличаться.

Автор: _Y_ 14.12.2011, 23:05
Кстати, побайтовой сравнение не так страшно как кажется.

В качестве модели возьмем два бинарных файла заполненных битами случайным образом. Тогда совпадение первых байтов фалов происходит с вероятностью 2 в степени -8. Совпадение двух первых байтов подряд уже в степени -16 и т.д. Подавляющее большинство пар будет отсеиваться уже на первых нескольких байтах.

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

Автор: lugaru 15.12.2011, 00:06
спасибо, дали более чем достаточно о чем подумать, байтовое сравнение оставлю на крайний случай.

Автор: LSD 15.12.2011, 11:40
Цитата(_Y_ @  14.12.2011,  19:14 Найти цитируемый пост)
3. Сравниваем что-нибудь-еще. Хэш, конрольную сумму, цвет глаз владельца - отбрасываем еще  99.99......% 
4. Оставшиеся сравниваем побайтово - единственный способ дающий полную гарантию. 

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

Автор: Stolzen 15.12.2011, 11:52
Цитата(LSD @  15.12.2011,  12:40 Найти цитируемый пост)
Вычисление хеша и так требует полного чтения файлов, можно сразу просто сравнить. 

Сравнивать все файлы со всеми целиком? Долго. Лучше в один проход вычислить хеши и потом уже их сравнивать.

Автор: LSD 15.12.2011, 12:28
Цитата(Stolzen @  15.12.2011,  12:52 Найти цитируемый пост)
Сравнивать все файлы со всеми целиком? Долго. Лучше в один проход вычислить хеши и потом уже их сравнивать. 

А как же первый пункт?
Цитата(_Y_ @  14.12.2011,  19:14 Найти цитируемый пост)
1. Сравниваем имена - 99.99......% сравнений дает "разные" - ответ получен. Об этих файлах больше не беспокоимся


Автор: _Y_ 15.12.2011, 12:41
Цитата(LSD @ 15.12.2011,  11:40)
Цитата(_Y_ @  14.12.2011,  19:14 Найти цитируемый пост)
3. Сравниваем что-нибудь-еще. Хэш, конрольную сумму, цвет глаз владельца - отбрасываем еще  99.99......%

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

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


Я, собственно, просто иллюстрировал основной принцип - более быстрый шаг делается до более медленного. Если предидущий шаг "перекрывает" результаты какого-то из последующих (например, побайтовое сравнение "перекрывает" все что угодно smile ), эти последующие шаги вообще не нужны.

Автор: LSD 15.12.2011, 13:04
Цитата(_Y_ @  15.12.2011,  13:41 Найти цитируемый пост)
Я, собственно, просто иллюстрировал основной принцип - более быстрый шаг делается до более медленного. Если предидущий шаг "перекрывает" результаты какого-то из последующих (например, побайтовое сравнение "перекрывает" все что угодно smile ), эти последующие шаги вообще не нужны. 

Вычисление 2-х хешей и их сравнение дольше, чем просто бинарное сравнение, вот о чем я писал. Хеши нужны если нужно найти дублирующиеся файлы.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)