同様のファイルまたは文字列を識別するのに役立つハッシュアルゴリズムはありますか?たとえば、ABCとXBCのハッシュは、通常のように根本的に異なるのではなく、類似しています。類似性の尺度の1つである編集距離を知っています( http://en.wikipedia.org/wiki/Edit_distance )。しかし、これは比較する各入力のハッシュを提供せず、任意の2つの入力間のスコアのみを提供します。
更新
Andan(localitysensitive hashing、LSH)のコメントは私が探していたものです。質問をする私の動機は、LSHがマルウェアのスキャンにどのように使用されるのか疑問に思っていたことです。マルウェアの特定に使用されますか?なぜか、なぜそうでないのか?
更新
トム・リークと同じように、私は自分の調査をいくつか行いました。 XORあらかじめ決められた「ランダム」パターンのファイルのバイト(シードは変更されませんでした)になるプログラムを作成しました。その後、合計1ビットを合計します。これにより、ランダムパターンからファイルまでのハミング距離実際には、基本的に(平均して)ファイルサイズを半分にして数値を算出するだけだったため、あまり有用な指標ではありませんでした。
いくつかの例:
私がスキャンした2つの関連する実行可能ファイルは、53808の差について2684964と2738772を記録しました。それらは確かに関連しています(私が書いたプログラムの異なるバージョン)が、53kの値はビット単位のファイルサイズの差の半分に近いです:〜128k。したがって、類似性を判断するための有用なメトリックではありません。
まったく異なる画像である、同じサイズの2つのJPEGをスキャンしました。それらは13934の違いについて3124915と3110981としてスキャンしました。したがって、それらは関連していませんが、関連する実行可能ファイルの違いよりも「小さい」ものでした。したがって、違いを判断するための有用な指標でもありません。
結論:
トム・リークが言ったように、それは理由のために未解決の問題です。
このようなハッシュが存在できない、または 用語の暗号化の意味 で「ハッシュ」にできない理由には、理論的な理由がいくつかあります。簡単に言えば、2つの「類似」入力のハッシュ値自体が「類似」している場合、それを使用して、与えられた出力から入力を効率的に回復できます抵抗。
あなたのタグから、あなたは[〜#〜] n [〜#〜]ウイルス「シグネチャ」を知っているウイルス対策ソフトウェアを設計しようとしていると思います"そして、これらのいずれかに「類似」(何らかの類似性の概念)のウイルスを検出するには[〜#〜] n [〜#〜]値、ただし計算コストが[〜#〜] n [〜#〜]比較よりも大幅に低い([〜#〜] n [〜#〜]は非常に高くなる可能性があります)。類似性の概念が「正確な同等性」である場合、シグネチャをソートし、コストO(log N)を使用してバイナリ検索を実行できます(ハッシュ関数は次に、すべての「署名」が一定の固定サイズになるようにすることで、プロセスをさらに高速化するために使用されます)。ただし、あまり鋭くない類似性の概念の場合、問題は難しくなります。
データベースの類似性検索は バイオインフォマティクスの既知の問題 であり、ヌクレオチドのシーケンスや、時折の違いにもかかわらず巨大なデータベースで照合する必要のある類似のオブジェクトに使用されます。肝心なことは、
ウイルス対策ソフトウェアがマシンの速度を落とさずに署名を確認する実際の方法はビジネスの中心にあるため、当然のことながらそれについてあまり話されていません。彼らが思いつくどんな解決策も、野生で観察された実際のウイルスの変化に関する多くの微調整と仮説を含む可能性が高いと推測できます。
「近似マッチングアルゴリズム」(まだNISTドラフト)または「類似性を維持するハッシュ関数」が興味を引くかもしれません。これらのアルゴリズムは、2つのデジタルオブジェクト間の類似性を決定するために特別に設計されています。これまでに提案されたアルゴリズムの一部(および有用)は(年代順)です: ssdeep 、 sdhash 、 mrsh-v2 。
オブジェクト間の類似性を判断するには、これらのアルゴリズムは最小限のデータチャンクを必要とします。 Mrsh-v2は、必要な最小サイズの点で最高のパフォーマンスを発揮します。
Mrsh-v2は、パフォーマンスと必要な最小チャンクサイズの点で本当に有望であるようですが、まだ開発中です。同様のファイルの処理に関する問題が解決されることを願っています。
ハッシュは特に、入力を可能な限り非類似にするためのものです。必要なのは、「類似した」アイテムを同じまたは隣接するビンに分類することを目的としたクラスタリングアルゴリズムです。類似性は明確に定義された概念ではなく、ドメイン固有の定義が必要になります。
思考実験のように、他のドキュメントから切り取って貼り付けることによって行われた定期的な紙の詐欺を検出したいとします。あなたは次のようなことをするかもしれません:
2つのドキュメントの類似性を比較するには、それらのドキュメントに共通するビン化ハッシュの数を数えます。