Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Python: hash, function, equality

Какими свойствами должна обладать хэш-функция объекта (в контексте корректной работы в хеш-таблицах)?

Вопрос проверяет знание контракта __hash__/__eq__ и понимание, почему “плохой хеш” ломает корректность и производительность словарей/множеств.

Короткий ответ

Хеш-функция должна быть детерминированной: для одного и того же объекта (в одном состоянии) она должна возвращать одно и то же число. Главное правило: если a == b, то hash(a) == hash(b) обязательно. Также хеш должен зависеть только от неизменяемых данных объекта, иначе ключ “потеряется” в dict/set. Для скорости важно, чтобы вычисление хеша было быстрым и давало хорошее распределение, чтобы было меньше коллизий.

Длинный ответ

Хеш-таблицы (dict, set) используют хеш, чтобы быстро находить “район” хранения ключа, а затем уточняют совпадение через сравнение ==.

Определение

Определение: Хеш-функция — функция, которая отображает объект в целое число (int), используемое для размещения/поиска объекта в хеш-таблице.

Обязательные свойства для корректности

Чтобы dict/set работали правильно, нужны свойства ниже.

1) Согласованность с равенством

  1. Если a == b, то обязательно hash(a) == hash(b)

  2. Обратное не требуется: hash(a) == hash(b) не означает, что a == b (это коллизия)

2) Стабильность во времени (для ключа)

Хеш не должен меняться, пока объект используется как ключ:

  • Если hash меняется после вставки в dict, то поиск по “тому же” объекту может не найти значение

Отсюда практическое правило:

  • Ключи должны быть неизменяемыми (или вести себя как неизменяемые)

3) Детерминированность

Для одного и того же состояния объекта __hash__ должен возвращать одинаковый результат в рамках процесса выполнения программы.

Свойства для производительности

Они не про “правильно/неправильно”, а про “быстро/медленно”:

  • Быстрое вычисление __hash__

  • Хорошее распределение значений (меньше коллизий)

Практика в Python: как правильно определить __hash__

Пример корректного ключа (неизменяемые поля)

class Point:
    __slots__ = ("x", "y")
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __eq__(self, other):
        return isinstance(other, Point) and (self.x, self.y) == (other.x, other.y)

    def __hash__(self):
        return hash((self.x, self.y))  # хеш от неизменяемой комбинации

Пример проблемы: изменили поле после вставки

p = Point(1, 2)
d = {p: "value"}

p.x = 100          # хеш поменялся (если зависит от x)
# теперь d[p] может работать неожиданно

Вывод

  • Для корректности важно: a == b ⇒ hash(a) == hash(b) и неизменяемость данных, участвующих в хеше.

  • Для скорости важно: хороший “разброс” хешей и быстрый __hash__.

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    5

  • Сложность:

    1

Навыки

  • Python

    Python

Ключевые слова

#hash

#function

#equality

Подпишись на Python Developer в телеграм

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.