2016-08-05 8 views
1

私はオブジェクトの大きなリストを大量に持っています。各オブジェクトには固有のIDがあります。ハッシュ最適化Java

List a = {obj1, obj2, obj3} 
List b = {obj3, obj4, obj5} 
List c = {obj1, obj2, obj3} 
// up to 100 million of them 

今、私はそれがメモリを節約するために、「リストA」と同じ内容を持っているので「リストC」を削除したい:それは次のようになります。

この目的のために、私はハッシュマップにすべてを追加して、キーがすでに存在するかどうかを確認します。オブジェクトは実際には大規模なネットワークグラフ内の参照です。一方が間違っていると、アプリケーション全体がクラッシュします。

StringBuilder sb = new StringBuilder(); 
    for (List list : myList) 
    sb.append(list.getId()); 
return Hashing.sha256().hashString(sb.toString(), Charsets.US_ASCII).toString(); 

は、これは完全に正常に動作します:私がデフォルト

List.hashCode() 

機能を使用する代わりに、これをしない異なるオブジェクトに同じ鍵があることは決してないだろうということが非常に重要ですので。ちょうどそれは非常に遅いです。少ない時間で同じ結果を達成する方法はありますか?

+0

あなたはあなたのリストのデフォルトのハッシュコードを試してくださいましたか? java.util.AbstractListリスト内の各オブジェクトからハッシュを計算します。 toStringは遅い操作であり、必要ありません。リストのデフォルトハッシュコードが遅すぎる場合は、リスト内のオブジェクトのハッシュコードを調べる必要があります。 –

+0

'List'sの' hashCode() 'の実装があなたの目的を果たしていないと思うのはなぜですか? –

+1

*異なるオブジェクトに同じキーが決して存在しないことが非常に重要なので*:それはなぜあなたにとって重要なのですか?明らかにSHA256ハッシュは非常に遅いでしょう:) – sstan

答えて

4

HashSetと通常のhashcodemethodsからListを使用して重複を削除します。それらの実装はあなたの考え方に似ています。

ので:

Set<List<String>> uniques = 
    new HashSet<>(Arrays.List<String>asList(a, b, c)); // {a, b} 
+0

申し訳ありませんが、私はそれを取得しません。 'List'のデフォルトの' hashcode'メソッドを使うと 'int'が得られます。 1億個のオブジェクトを持つことで、intの範囲が約40億にすぎないため、衝突の確率は非常に高くなります。衝突を避けることは重要です。 – Yojimbo

+0

これは '' equals''が働くときです:2つのリストが同じハッシュコードで終わるならば、等価性がチェックされます。 –

+0

はい!そして、それが効率的であることを忘れないでください。equalsメソッドは、衝突があるときにのみ呼び出されます。 – JavaHopper