これを行う最善の方法は、文字列をハッシュし、ハッシュのリストをある種の順序付けられたリストに格納し、ルックアップ時間を高速にして、データセットから新しい文字列が渡されたときにいつでも比較できるようにすることだと考えました。
いいえ、そうしないでください。2 つの理由:
- ハッシュは、2 つの値が同じかどうかのみを示します。それらが同じかどうかはわかりません。
- あなたはすでにあなたのために行われている多くの仕事をしているでしょう.
基本的には、HashSet<String>
. それは問題ないはずです。簡単なルックアップが必要です。自分で実装する必要はありません。
欠点は、すべての文字列をメモリに保持することになることです。それが問題である場合は、別の戦略を立てる必要があります...実際には、ハッシュだけをメモリに保持することになる可能性があります。正確な詳細は、おそらく文字列がどこから来ているか、および誤検知が発生した場合にどのような問題が発生するかによって異なります。たとえば、各文字列の MD5 ハッシュを「単なるhashCode
」ハッシュよりも優れたものとして保持できますが、それでも攻撃者は同じハッシュを持つ別の文字列を提示することができます。問題ありますか?その場合は、より安全なハッシュ アルゴリズム (SHA-256 など) が役立つ可能性があります。ただし、文字列ごとに異なるハッシュになることは保証されません。
本当に確実にしたい場合は、ハッシュをメモリに保持する必要がありますが、実際の文字列データを (ディスクまたはデータベースに) 保持する必要があります。前) 保存された文字列を新しい文字列と比較する必要があります。
ハッシュをメモリに格納している場合、最適なアプローチは、使用しているハッシュのサイズによって異なります。たとえば、64 ビット ハッシュだけの場合は、Long
ハッシュごとを使用して、HashSet<Long>
. より長いハッシュの場合、簡単に比較できるオブジェクトなどが必要になります。その時点で、 (Guava v16 以降非推奨)のファクトリ メソッドと共に、Guavaとそのクラスを確認することをお勧めします。HashCode
HashCodes