Уникальность crc32 для файлов
Модераторы: Avada, CaptainFlint, Nik, d-view, Моторокер
Если файлы разного размера — они не равны.Batya писал(а):Есть идеи алгоритма?
Если 2 файла одного размера — сравниваем по содержимому.
Если 3 и более файлов одного размера — вычисляем простой и быстрый хеш (например CRC16) и сравниваем хеши. Если хеши не равны, то не равны и файлы. Если хеши равны — сравниваем файлы по содержимому.
Где (или как)? Тоже любопытно.Volniy писал(а):Кстати, только что подсмотрел, как это реализовано у Гислера.
- CaptainFlint
- Сообщения: 6239
- Зарегистрирован: Вт дек 14, 2004 22:34
- Контактная информация:
Любой хэш, какой бы быстрый он ни был, требует полного считывания всего содержимого файла. И плюс сравнение по содержимому выполнит полное считывание. Да ещё, не исключено, что не единожды (если файлов несколько). Мне кажется, надо использовать что-то более хитрое. Например, так:Tol!k писал(а):Если 3 и более файлов одного размера — вычисляем простой и быстрый хеш (например CRC16) и сравниваем хеши. Если хеши не равны, то не равны и файлы. Если хеши равны — сравниваем файлы по содержимому.
1. Получили полный список файлов.
2. Разбили на группы с одинаковым размером.
3. Внутри каждой группы считываем по блоку длиной N из каждого файла, сравниваем эти блоки попарно.
4. По результатам сравнения разбиваем файлы из текущей группы на подгруппы, внутри которых содержимое всех считанных к данному моменту блоков у всех файлов идентичное.
5. Повторяем шаги 3-4, пока файлы не будут считаны и сравнены полностью.
6. Полученный набор подгрупп и представляет собой разбиение всех файлов на одинаковые по содержимому, причём каждый из файлов в процессе работы был полностью прочитан ровно один раз.
Почему же, ё-моё, ты нигде не пишешь "ё"?
- Lazy Crazy
- Сообщения: 400
- Зарегистрирован: Вс янв 16, 2005 20:53
Изначально Batya упоминал, что всё это нужно для топика "автоматическое удаление файлов по датам создания", который начинал Neo233 с проблемой идентификации ‘картинок с Web-камеры’ в ‘кэше Internet Explorer`a’. А значит размер файлов относительно небольшой и даже полное сравнение не должно быть проблемой…

CaptainFlint
Отличная мысль. Надо подумать, можно ли это сделать через vbs.
Отличная мысль. Надо подумать, можно ли это сделать через vbs.
Это верно, но хотелось бы найти оптимальное решение для любого случая.Lazy Crazy писал(а):А значит размер файлов относительно небольшой и даже полное сравнение не должно быть проблемой…
Нет, я не сплю. Я просто медленно моргаю.
- Моторокер
- Сообщения: 1517
- Зарегистрирован: Пт май 06, 2005 08:22
- Откуда: г. Пермь (читается Перьмь)
- Контактная информация:
Если уж файл читаем, почему бы не считать параллельно его сумму? Операции с файлами намного медленней операций в оперативке.Batya писал(а):при таком подходе надо будет значительное число раз читать одни и те же файлы. (Предположим, что размеры файлов совпадают.)
Можно хранить кол-во считанного и нерассчитанную до конца сумму.
плагины для Total Commander, статьи Graphics Converter; NSCopy; SEO HTML; KillOK; Плагин на Delphi
ПармаСруб - строительство домов и бань в Перми
ПармаСруб - строительство домов и бань в Перми
- alexanderwdark
- Сообщения: 304
- Зарегистрирован: Пн апр 14, 2008 21:03
- Откуда: Россия
- Контактная информация:
Любой хэш по определению не уникален. Нельзя однозначно представить большой объем информации гораздо меньшим. Криптографически стойкий хэш только тем и отличается, что довольно сложно найти коллизии, т.е. такие совпадения исходных данных, при которых значения хэша одинаковы.
Длина самой хэш суммы здесь только косвенно влияет на надежность и стойкость. Есть определенный минимум, конечно. Скажем, 80-128 бит. Короче - сликом мало вариантов.
Но, сам алгоритм подсчета может быть уязвим для совпадений / коллизий. Сейчас на конкурсе SHA3 уже тьма новых, хороших на первый взгляд, хэшей были отсеяны - хотя и давали на выходе 512 и выше бит (64 байта). Приничой были именно коллизии, а у кого и возможность частично предсказать исходную информацию на основе хэша.
MD5 уже давно сломали, SHA1 так же не надежен. От SHA2 уже отказываются. Скоро уже будет известен SHA3, финалистов уже совсем не много осталось.
Уже можно выделить отличные алгоритмы: Keccak и Skein. Что особенно у них интересно - они гибкие, длина хэша может быть любой, не фиксирована до типовых 128, 256, 384, 512 бит.
Последний заточен под 64-битные системы, поэтому на 32-разрядных ОС довольно медлителен. Keccak в этом плане интереснее, если победит, у нас будет отличный алгоритм для самых различных целей.
Впрочем, никто не мешает для TC использовать абсолютно любой алгоритм подсчета хэш суммы файла. Это если по каким либо причинам нужна гарантия подлинности файла (неизменности).
Хотя и сейчас есть способ: считайте сразу две хэш-суммы. Вероятность подмены / совпадения сразу двух хэшей практически нереальна.
Длина самой хэш суммы здесь только косвенно влияет на надежность и стойкость. Есть определенный минимум, конечно. Скажем, 80-128 бит. Короче - сликом мало вариантов.
Но, сам алгоритм подсчета может быть уязвим для совпадений / коллизий. Сейчас на конкурсе SHA3 уже тьма новых, хороших на первый взгляд, хэшей были отсеяны - хотя и давали на выходе 512 и выше бит (64 байта). Приничой были именно коллизии, а у кого и возможность частично предсказать исходную информацию на основе хэша.
MD5 уже давно сломали, SHA1 так же не надежен. От SHA2 уже отказываются. Скоро уже будет известен SHA3, финалистов уже совсем не много осталось.
Уже можно выделить отличные алгоритмы: Keccak и Skein. Что особенно у них интересно - они гибкие, длина хэша может быть любой, не фиксирована до типовых 128, 256, 384, 512 бит.
Последний заточен под 64-битные системы, поэтому на 32-разрядных ОС довольно медлителен. Keccak в этом плане интереснее, если победит, у нас будет отличный алгоритм для самых различных целей.
Впрочем, никто не мешает для TC использовать абсолютно любой алгоритм подсчета хэш суммы файла. Это если по каким либо причинам нужна гарантия подлинности файла (неизменности).
Хотя и сейчас есть способ: считайте сразу две хэш-суммы. Вероятность подмены / совпадения сразу двух хэшей практически нереальна.
CRC32 не уникален для файлов разного размера - это было замечено на практике. Причем если для файлов одного размера вероятность совпадения хэша при различном содержимом файлов достаточно мала, то в группе файлов отличающихся по размеру вероятность встретить файлы с одинаковым CRC32 (и естественно различным содержимым) - велика. (Это было замечено при сравнении большого количества фото и видео файлов снятых с помощью камеры мобильного телефона).
- alexanderwdark
- Сообщения: 304
- Зарегистрирован: Пн апр 14, 2008 21:03
- Откуда: Россия
- Контактная информация:
Вполне, поскольку сумма - циклическая. Ее есть смысл проверять, если размер файла идентичен.Mite писал(а):CRC32 не уникален для файлов разного размера - это было замечено на практике. Причем если для файлов одного размера вероятность совпадения хэша при различном содержимом файлов достаточно мала, то в группе файлов отличающихся по размеру вероятность встретить файлы с одинаковым CRC32 (и естественно различным содержимым) - велика. (Это было замечено при сравнении большого количества фото и видео файлов снятых с помощью камеры мобильного телефона).
Если судить только по совпадению crc32, не сравнивая никакие другие параметры файлов, то этого недостаточно! Необходим хотя бы еще один параметр: или размер, илиBatya писал(а):Насколько можно по совпадению crc32 судить о совпадении содержимого у 2-х разных файлов?
alexanderwdark писал(а):считайте сразу две хэш-суммы. Вероятность подмены / совпадения сразу двух хэшей практически нереальна.
Вставлю лыко в строку.
Любой ХЭШ есть сжатие с потерями.
Представляется наиболее разумным следуюющий подход:
Выбираем некую константу, для размера блока, меньшую сегмента памяти.
Скажем, 4 килобайта.
Все файлы, требующие сравнения, длина которых меньше этого блока,
просто сравниваются друг с другом. (строим дерево, для ускорения сравнения, представляя данные как очень длинное число)
Файлы большей длины обсчитываем быстрой CRC(иной хэш), разбивая на блоки такой длины, чтобы в общая длина всех CRC блоков + CRC всего файла занимали этот блок.
Далее - аналогично маленьким файлам.
Но, еще с одной итерацией.
Если, по Дирихле, в узел дерева (ящик Дирихле), попадёт более одного элемента - проводим полное сравнение файлов.
Чем больше длина блока -тем лучше работает метод.
Расход памяти на посроение деревьев и выделение блоков может быть значительным.
Возможно, имеет делать предварительное построение еще одного дерева по длинам файлов и запускать этот алогритм для каждого узла отдельно.
Любой ХЭШ есть сжатие с потерями.
Представляется наиболее разумным следуюющий подход:
Выбираем некую константу, для размера блока, меньшую сегмента памяти.
Скажем, 4 килобайта.
Все файлы, требующие сравнения, длина которых меньше этого блока,
просто сравниваются друг с другом. (строим дерево, для ускорения сравнения, представляя данные как очень длинное число)
Файлы большей длины обсчитываем быстрой CRC(иной хэш), разбивая на блоки такой длины, чтобы в общая длина всех CRC блоков + CRC всего файла занимали этот блок.
Далее - аналогично маленьким файлам.
Но, еще с одной итерацией.
Если, по Дирихле, в узел дерева (ящик Дирихле), попадёт более одного элемента - проводим полное сравнение файлов.
Чем больше длина блока -тем лучше работает метод.
Расход памяти на посроение деревьев и выделение блоков может быть значительным.
Возможно, имеет делать предварительное построение еще одного дерева по длинам файлов и запускать этот алогритм для каждого узла отдельно.