ファイルの類似性を判断することに関連するいくつかの質問をここで見ましたが、それらはすべて特定のドメイン (画像、音声、テキストなど) にリンクされています。ソリューションとして提供される手法では、比較対象のファイルの基になるファイル形式に関する知識が必要です。私が探しているのは、この要件のない方法です。この方法では、含まれるデータの種類を理解する必要なく、任意のバイナリ ファイルを比較できます。つまり、2 つのファイルのバイナリ データの類似性パーセンテージを判断しようとしています。
これは多くのことに適用できる可能性がありますが、私が取り組んでいる特定の問題があります。現在、実用的なソリューションもありますが、理想的ではないと思います。比較方法と結果の保存に関しては、おそらく多くの最適化があります。うまくいけば、ここにいる何人かの人々が私にいくつかの新しいアイデアを与えることができます. 数日後に現在の方法に関する情報を編集する予定ですが、私がすでに行っている方法を説明することで、問題に関する人々の考えを偏らせたくはありません.
私が取り組んでいる問題は、ビデオ ゲームの ROM イメージのクローン検出です。エミュレーションの経験がない方のために説明すると、ROM はゲーム カートリッジのデータのダンプです。ROM「クローン」は通常、同じゲームの修正版であり、最も一般的なタイプは翻訳版です。たとえば、ファミコン用のオリジナルのファイナルファンタジーの日本語版と英語版はクローンです。ゲームはほぼすべてのアセット (スプライト、音楽など) を共有していますが、テキストは翻訳されています。
現在、さまざまなシステムのクローンのリストを維持する作業を行っているグループがいくつかありますが、私が知る限り、これはすべて手動で行われています。私が試みているのは、「これらは同じゲームのように見える」のではなく、データの類似性に基づいて、類似した ROM イメージを自動的かつ客観的に検出する方法を見つけることです。クローンを検出する理由はいくつかありますが、主な動機の 1 つは、Solid 圧縮を使用することです。これにより、すべてのゲーム クローンを同じアーカイブにまとめて圧縮できます。多くの場合、圧縮されたクローン セット全体は、個々の ROM の 1 つよりもわずかに多くのスペースしか占有しません。
潜在的なアプローチを考え出す際に考慮すべきいくつかの懸念事項:
- ROM のサイズは、システムによって大きく異なります。小さいものもありますが、最新のシステムには 256MB 以上の大きなものがある場合があります。一部の (すべての?) システムでは、可能なサイズとして 2 の累乗しかありません。これらのシステムの 1 つで 130MB のゲームを実行すると、256MB の ROM が使用され、ほとんど空になります。このため、ゲームのバージョンがしきい値を超え、2 倍のサイズのカートリッジを使用する必要がある場合、一部のクローンのサイズが大幅に異なる可能性があることに注意してください。
- 現在、多くのシステムには数千の既知の ROM があり、ほとんどのシステムでは新しい ROM が常にリリースされています。古いシステムでも、変更された ROM を頻繁に作成する主要な ROM ハッキング コミュニティがあります。
- ROM のすべての可能なペアの類似性データを格納すると、より一般的なシステムのいずれかで数百万行のデータが生成されます。5000 の ROM を備えたシステムでは、2500 万行の類似性データが必要になり、1 つの新しいゲームでさらに 5000 行が追加されます。
- 中断された場合に中断したところから再開できるように、処理の状態は回復可能でなければなりません。どの方法でも、多くの処理が必要になるため、すべてが 1 つのバッチで実行されると仮定するのは安全ではありません。
- 新しい ROM はいつでも追加される可能性があるため、この方法では、「完全な」セットが既にあると想定しないでください。つまり、既存のすべての ROM の類似性をすでに把握した後でも、新しい ROM が追加された場合 (これは前の処理が完全に終了する前に発生する可能性もあります)、それを以前のすべての ROM と比較して判断する方法が必要です。 (もしあれば)それはのクローンです。
- 精度よりも処理速度を優先する必要があります(ある程度)。2 つの ROM が 94% または 96% 類似しているかどうかを知ることは特に重要ではありませんが、新しい ROM を以前のすべての ROM と比較するのに 1 日かかる場合、プログラムはおそらく完全には完了しません。
取り組むのは興味深い問題でした。他の人が何を考え出すことができるかを楽しみにしています。詳細が必要な場合は、コメントでお知らせください。提供できるように努めます。