我在这里看到了一些与确定文件相似性有关的问题,但它们都与特定域(图像、声音、文本等)相关联。作为解决方案提供的技术需要了解被比较文件的基础文件格式。我正在寻找的是一种没有此要求的方法,可以比较任意二进制文件而无需了解它们包含什么类型的数据。也就是说,我正在寻找确定两个文件的二进制数据的相似性百分比。
为了提供更多细节供您使用,尽管这可能适用于许多事情,但我确实有一个正在处理的特定问题。我目前也有一个可行的解决方案,但我认为它并不理想。在比较方法和存储结果方面可能有很多优化。希望这里的一些人能够给我一些新的想法。几天后我可能会编辑一些关于我当前方法的信息,但我不想通过告诉你我已经在做什么来偏见人们对这个问题的看法。
我正在处理的问题是视频游戏 ROM 映像的克隆检测。对于那些没有仿真经验的人来说,ROM 是游戏卡带上数据的转储。ROM“克隆”通常是同一游戏的修改版本,最常见的类型是翻译版本。例如,NES原版《最终幻想》的日文版和英文版都是克隆版。游戏共享几乎所有的资产(精灵、音乐等),但文本已被翻译。
目前有几个小组致力于维护各种系统的克隆列表,但据我所知,这一切都是手动完成的。我正在尝试做的是找到一种方法来自动和客观地检测相似的 ROM 映像,基于数据相似性而不是“这些看起来像同一个游戏”。检测克隆有几个原因,但主要动机之一是与Solid 压缩一起使用。这允许将所有游戏克隆一起压缩到同一个存档中,整个压缩克隆集通常只占用比单个 ROM 稍多的空间。
在提出潜在方法时需要考虑的一些问题:
- ROM 的大小差异很大,具体取决于系统。有些很小,但现代系统可能有较大的系统,256MB 或更多。一些(全部?)系统只有 2 作为可能大小的幂,其中一个系统上的 130MB 游戏将有 256MB ROM,大部分是空的。请注意,因此,如果游戏版本超过阈值并且必须使用两倍大小的卡带,某些克隆的大小可能会有很大差异。
- 目前,许多系统上有数千个已知的 ROM,大多数系统仍在不断发布新的 ROM。即使对于旧系统,也有一个主要的 ROM 黑客社区经常生产修改后的 ROM。
- 为每对可能的 ROM 存储相似性数据将为任何更流行的系统产生数百万行数据。一个有 5000 个 ROM 的系统需要 2500 万行相似性数据,而一个新游戏又增加了 5000 行。
- 处理的状态必须是可恢复的,这样如果它被中断,它可以从中断的地方继续。使用任何方法都需要进行大量处理,并且假设整个事情将在一批中运行是不安全的。
- 可以随时添加新的 ROM,因此该方法不应假定它已经具有“完整”集。也就是说,即使您已经确定了所有现有 ROM 的相似性,如果添加了一个新 ROM(这也可能在之前的处理完全完成之前发生),必须有一种方法将其与所有之前的 ROM 进行比较,以确定哪个(如果有的话)是它的克隆。
- 更高的处理速度应该优先于准确性(到一个点)。知道两个 ROM 是 94% 还是 96% 相似并不是特别重要,但如果需要一天的时间来比较一个新的 ROM 和以前的所有 ROM,那么程序可能永远不会真正完成。
这是一个有趣的问题,我期待看到其他人能想出什么。如果您需要更多详细信息,请在评论中告诉我,我会尽力提供。