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