この質問を解決するために、Hashable Protocol を実装するカスタム構造体をいじってみました。==
を入力するときにハッシュ衝突があるかどうかに応じて、等価演算子オーバーロード()が呼び出される回数を確認しようとしていDictionary
ます。
アップデート
@mattは、Hashable プロトコルを実装し、どのくらいの頻度hashValue
で==
呼び出されるかを示すカスタム構造体のよりクリーンな例を書きました。以下に彼のコードをコピーしています。私の元の例を見るには、編集履歴をチェックしてください。
struct S : Hashable {
static func ==(lhs:S,rhs:S) -> Bool {
print("called == for", lhs.id, rhs.id)
return lhs.id == rhs.id
}
let id : Int
var hashValue : Int {
print("called hashValue for", self.id)
return self.id
}
init(_ id:Int) {self.id = id}
}
var s = Set<S>()
for i in 1...5 {
print("inserting", i)
s.insert(S(i))
}
これにより、次の結果が生成されます。
/*
inserting 1
called hashValue for 1
inserting 2
called hashValue for 2
called == for 1 2
called hashValue for 1
called hashValue for 2
inserting 3
called hashValue for 3
inserting 4
called hashValue for 4
called == for 3 4
called == for 1 4
called hashValue for 2
called hashValue for 3
called hashValue for 1
called hashValue for 4
called == for 3 4
called == for 1 4
inserting 5
called hashValue for 5
*/
Hashable は Equatable を使用してハッシュの衝突を区別するため (とにかくだと思います)、func ==()
ハッシュの衝突が発生した場合にのみ呼び出されることを期待します。ただし、上記の @matt の例ではハッシュの衝突はまったくなく、まだ==
呼び出されています。ハッシュの衝突を強制する他の実験 (この質問の編集履歴を参照) では==
、ランダムな回数呼び出されたようです。
ここで何が起こっているのですか?