Я видел здесь несколько вопросов, связанных с определением сходства файлов, но все они связаны с определенной областью (изображения, звуки, текст и т. Д.). Методы, предлагаемые в качестве решений, требуют знания основного формата сравниваемых файлов. Я ищу метод без этого требования, в котором можно было бы сравнивать произвольные двоичные файлы без необходимости понимать, какой тип данных они содержат. То есть я хочу определить процент схожести двоичных данных двух файлов.
Чтобы дать вам немного больше деталей, чтобы вы могли поработать, хотя это потенциально применимо ко многим вещам, у меня есть конкретная проблема, над которой я работаю. У меня тоже есть рабочее решение, но я не думаю, что оно идеальное. Вероятно, есть много оптимизаций с точки зрения метода сравнения и хранения результатов. Надеюсь, некоторые люди здесь смогут поделиться со мной новыми идеями. Я, вероятно, отредактирую некоторую информацию о моем текущем методе через пару дней, но я не хочу искажать мнения людей о проблеме, рассказывая вам, как я уже это делаю.
Проблема, над которой я работаю, - это обнаружение клонов для образов ПЗУ видеоигр. Для тех, кто не имеет опыта эмуляции, ПЗУ - это свалки данных на игровых картриджах. «Клон» ПЗУ обычно представляет собой модифицированную версию той же игры, наиболее распространенным типом которой является переведенная версия. Например, японская и английская версии оригинальной Final Fantasy для NES являются клонами. У игр есть общие ресурсы (спрайты, музыка и т. Д.), Но текст был переведен.
В настоящее время существует несколько групп, которые работают над поддержанием списков клонов для различных систем, но, насколько я могу судить, все это делается вручную. Что я пытаюсь сделать, так это найти метод автоматического и объективного обнаружения похожих образов ПЗУ на основе схожести данных, а не «они кажутся одной и той же игрой». Есть несколько причин для обнаружения клонов, но одна из основных причин - использование твердого сжатия. . Это позволяет сжимать все клоны игры вместе в один и тот же архив, при этом весь набор сжатых клонов часто занимает лишь немного больше места, чем одно из отдельных ПЗУ.
Некоторые проблемы, которые следует учитывать при разработке потенциальных подходов:
- ПЗУ сильно различаются по размеру в зависимости от системы. Некоторые из них маленькие, но современные системы могут иметь большие, 256 МБ и более. Некоторые (все?) Системы имеют мощность только 2 возможных размеров, игра на 130 Мбайт на одной из этих систем будет иметь 256 Мбайт ПЗУ, в основном пустое. Обратите внимание, что из-за этого некоторые клоны могут иметь совершенно разные размеры, если версия игры превышает пороговое значение и должна использовать картридж, который в два раза больше.
- В настоящее время существуют тысячи известных ПЗУ во многих системах, при этом для большинства систем постоянно выпускаются новые. Даже для старых систем существует крупное сообщество хакеров ПЗУ, которое часто производит модифицированные ПЗУ.
- Сохранение данных о сходстве для каждой возможной пары ПЗУ приведет к миллионам строк данных для любой из наиболее популярных систем. Система с 5000 ПЗУ потребует 25 миллионов строк данных о сходстве, а одна новая игра добавит еще 5000 строк.
- Состояние обработки должно быть восстанавливаемым, чтобы в случае прерывания можно было продолжить с того места, где оно было остановлено. При любом методе потребуется много обработки, и предполагать, что все это будет выполняться одним пакетом, небезопасно.
- Новые ПЗУ могут быть добавлены в любое время, поэтому метод не должен предполагать, что у него уже есть «полный» набор. То есть даже после того, как вы уже выяснили сходство для всех существующих ПЗУ, если добавляется новый (а это также может произойти до того, как предыдущая обработка была полностью завершена), должен существовать метод для сравнения его со всеми предыдущими, чтобы определить который (если есть) является клоном.
- Более высокая скорость обработки должна иметь приоритет над точностью (до точки). Знание того, похожи ли два ПЗУ на 94% или 96%, не особенно важно, но если для сравнения нового ПЗУ со всеми предыдущими потребуется день обработки, программа, вероятно, никогда не завершится по-настоящему.
Это была интересная проблема для работы, я с нетерпением жду возможности увидеть, что могут придумать другие люди. Дайте мне знать в комментариях, если вам нужны какие-либо подробности, и я постараюсь их предоставить.