Как эффективно идентифицировать бинарный файл - PullRequest
4 голосов
/ 14 августа 2010

Какой самый эффективный способ идентифицировать двоичный файл?Я хотел бы извлечь какую-то сигнатуру из двоичного файла и использовать ее для сравнения с другими.

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

(хотя примеры кода Java предпочтительнее, язык-агностические ответы приветствуются)

Редактировать : Сканирование всего файла для создания хэша имеет тот недостаток, что чем больше файл, тем дольше он занимает.Поскольку хэш не был бы уникальным в любом случае, мне было интересно, существует ли более эффективный подход (т. Е. Хэш от равномерно распределенной выборки байтов).

Ответы [ 4 ]

11 голосов
/ 14 августа 2010

Подход, который я нашел эффективным для такого рода вещей, заключался в вычислении двух хэшей SHA-1.Один для первого блока в файле (я произвольно выбрал 512 байт в качестве размера блока) и один для всего файла.Затем я сохранил два хэша вместе с размером файла.Когда мне нужно было определить файл, я сначала сравнил бы длину файла.Если длины совпадают, то я бы сравнил хэш первого блока, а если он совпадает, я сравнил хэш всего файла.Первые два теста быстро отсеяли много несоответствующих файлов.

3 голосов
/ 14 августа 2010

Вот для чего хеширование .См. MessageDigest .

Обратите внимание, что если ваш файл слишком большой для чтения в памяти, это нормально, потому что вы можете подавать куски файла в хэш-функцию.Например, MD5 и SHA1 могут принимать блоки по 512 битов.

Кроме того, два файла с одинаковым хеш-кодом не обязательно идентичны (хотя очень редко они не совпадают), но два идентичных файла имеютобязательно тот же хеш.

2 голосов
/ 14 августа 2010

Обычный ответ - использовать MD5, но я хотел бы предположить, что слишком много коллизий, чтобы использовать MD5 в современных приложениях: http://www.mscs.dal.ca/~selinger/md5collision/

SHA-1 заменил MD5 более десяти лет назад.

В 2005 году NIST рекомендовал использовать SHA-2 вместо SHA-1 к 2010 году, поскольку была проделана работа по демонстрации столкновений в уменьшенных вариантах SHA-1. (Это довольно хорошее предвидение, поскольку теперь известно , что для нахождения коллизий требуется 2 ^ 51 работы, а в идеале для поиска коллизий требуется 2 ^ 80.)

Поэтому, пожалуйста, исходя из того, что вы пытаетесь сделать, и с какими другими программами вам может потребоваться взаимодействие, выберите MD5 (пожалуйста, нет), SHA-1 (я бы понял, но мы можем добиться большего) и SHA-2 (выбери меня! выбери меня!).

0 голосов
/ 14 августа 2010

Учитываете ли вы использование идентификации заголовка.Если вы можете создать свои файлы таким образом, это будет быстро и надежно.Используя один байт, вы можете различить 255 типов файлов;)

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