2016-10-21 5 views
3

hashValueスイフトでの選択に関するパフォーマンス上の考慮事項がありますHashableSetに挿入できるタイプはありますか?例えば、私が選択した整数値のサイズはバッキング配列のサイズに影響しますか?すなわち、hashValue4000をタイプに割り当て、それをSetに挿入すると、バッキングアレイの長さは少なくとも4000である必要がありますか?迅速なプロトコルでのhashValueのパフォーマンスに関する考慮事項Hashable

+0

"backing array"またはなぜ 'hashValue'がそれと関係するのかは、ここで何を意味するのかは不明です。 (私は答えが「いいえ」と思っていますが、私は本当にその質問を理解していません。) –

+0

私は特に「セット」を考えています。残念です。 – gloo

+1

私は、セットがハッシュ値がインデックスである配列として実装されていると思いますか?彼らの実装方法ではありません。それらはハッシュテーブルです。 https://en.wikipedia.org/wiki/Hash_table。ハッシュ値自体はかなり無関係です。理想的には、Int領域全体でランダムなので衝突はなく、テーブルはバランスがとれています(バイナリツリーを使用しているかどうかは分かりません; https://github.com/apple/swiftを参照してください)。 /blob/master/stdlib/public/core/HashedCollections.swift.gyb) –

答えて

5

hashValueは、一意である必要はありません。大部分のケースでは、であることはできません(64ビットより大きいタイプは必然的にそのハッシュよりも多くの状態を持つ必要があります)。整数のサイズは選択しません。常にInt(マシンのワードサイズ)になります。

hashValueは、理想的にはO(1)であるべきです。これは、等価性チェックを最適化するためによく使用されます(非常に遅い可能性があります)。

hashValueの最も簡単な実装は次のとおりです。

var hashValue: Int { return 1 } 

は、これは完全に有効なハッシュです。特にではなく、ハッシュですが、すべての要件を満たしています。それは計算が速く、すべての等しいオブジェクトは等しいハッシュを持ちます(これは要件です;逆は必要ありません。等ハッシュは等しいオブジェクトを暗示することはできません)。

関連する問題