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

Что здесь происходит?

Ответы на вопрос(2)

Ваш ответ на вопрос