Как Словарь использует Equatable протокол в Swift?
Чтобы решитьэтот вопросЯ играл с пользовательской структурой, которая реализует протокол Hashable. Я пытаюсь увидеть, сколько раз перегрузка оператора эквивалентности (==
) вызывается в зависимости от того, есть ли столкновение хешей или нет при заполнении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 выше нет коллизий хешей, и все же==
все еще вызывается. В других моих экспериментах форсирование коллизий хешей (см. Историю редактирования этого вопроса),==
казалось, вызывали случайное количество раз.
Что здесь происходит?