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