Вопрос проверяет понимание того, как словарь выполняет быстрый поиск и почему не любой тип может быть ключом
Ключи должны быть Hashable, потому что словарь использует хеш-значение для быстрого поиска. Хеш позволяет быстро определить позицию элемента в таблице. Без хеша поиск был бы линейным и медленным. Также Hashable требует корректного сравнения на равенство. Это гарантирует корректную работу словаря.
Требование Hashable — фундаментальная часть контракта Dictionary.
HashableОпределение:Hashable — это протокол, который позволяет получить хеш-значение объекта и сравнивать его с другими.
Он требует:
реализацию hash(into:)
корректную реализацию Equatable
Hashable используется в DictionaryАлгоритм работы:
вычисляется хеш ключа
по хешу определяется бакет
при коллизии выполняется сравнение через ==
Если два ключа равны (==):
они обязаны иметь одинаковый хеш
Обратное не обязательно.
HashableБез хеша:
нельзя быстро найти элемент
каждая операция стала бы O(n)
словарь теряет смысл
Поэтому компилятор запрещает такие ключи.
Хороший ключ:
имеет стабильный хеш
не меняется после вставки
корректно реализует ==
Изменяемые свойства в ключах — частая причина багов.
Hashable — это контракт, на котором держится производительность и корректность Dictionary. Без него словарь не мог бы работать эффективно.