2016-08-26 21 views
0

私は10Mのレコードを持っています。各レコードには約100のフィールドがあります。私がレコードを読むとき、私はそのレコードが前に読んだ別のレコードの複製であるかどうかを判断したい。重複チェックの基準は20フィールドに基づいており、正確な同等性をチェックします。私は新しい記録を取って、20の各フィールドの前のすべての記録と比較することができます。ユニークなハッシュ値を生成する方法は?

私が検討しているもう1つのアプローチは、20個のフィールドを1つのフィールドにハッシュし、そのハッシュと以前のすべてのレコードのハッシュを比較することです。このために私には一意性を与えるハッシュ関数が必要です。私は、SHA512、SHA224などの機能があることを認識しています。どのハッシュ関数が私のユースケースに適していますか?

よろしく、 "perfect hashing" と呼ばれているあなたは後にしている
ヤシュ

+0

任意のハッシュ関数が衝突を起こす可能性があります。同様のハッシュセットまたはsmthを使用する必要があります。 – AdamSkywalker

+0

一見すると、SHA-256などが必要です。 20のフィールドは何ですか? ints?文字列?文字列の場合は平均の長さですか? – Taylor

+2

と同じくらい良くて強く、ハッシュ関数は一意性を保証しません。 あなたは最高の状態を取って、衝突の可能性を狭める完全な別のアプローチで別のものに組み合わせることもできますが、それは理論上でも可能です。 –

答えて

0

。ハッシュ関数を2つのステップで構成する、つまり2つのハッシュ関数を構成する古典的な方法があります。構成は幾分関係していますが、それを調べたいと思うかもしれません。

+0

2段階アプローチを使用することもできます。1つのハッシュ関数を使用して重複レコードを確認し、検出された重複のすべてのセットに対して別のハッシュ関数または実際の比較を使用して、それらが実際の重複であり、 –

+1

@FlorianLink ...ハッシュテーブルが通常どのように実装されているか、つまり、ハッシュの同等性だけに頼るのではなく、元のデータの等価性をチェックしていれば_some_の衝突を持つこともできます。 – Thomas

0

私はこのような大規模ではない前に同様の問題に取り組んだが、私は自分の経験を共有します。うまくいけば助けになるでしょう。それは簡単な解決策であり、あなたが基本を知っていると仮定しているので、あなたはこれをjavaタグを使って投稿しています。 溶液の3部があります。

  1. java.lang.Stringクラスにハッシュ方法を使用して単純なハッシュを計算するために、長い文字列に20個のパラメータの接合。
  2. タブ、改行、復帰などの適切な区切り文字を選択したり、レコードに存在しないような固有の長い文字列を選択して、予期しない衝突を削除します。例:「Stack Exchangeに存在する可能性の低い文字列は、1234abcdに応答します。」整数、文字列、お気に入りの見積もり、必要なものがあればそれを作ることができます。セパレータを使用して20のフィールドに参加します。この手順では、これらの20個のフィールドに表示されているデータを理解する必要があります。すべての整数が 'a'のような単純な文字であれば問題ありません。
  3. レコードのハッシュを計算し、HashSetにレコードを1つずつ格納します。あなたが以前にそれを見たことがあるかどうかをチェックして、それを取り除くか、あなたがそれを取ることを望む何らかの行動を取ることができます。
関連する問題