Позволяет настраивать хеширование объектов, а также управлять его возможностью.
object.__hash__(self)
self -- Ссылка на экземпляр.

Вызывается встроенной функцией hash(), а также для операций над элементами коллекций, использующих хеши, включая множества (set), статичные множества (frozenset), словари (dict).

Единственным требованием является то, чтобы объекты являющиеся равными имели одинаковый хеш. Рекомендуется неким образом смешать (например, при помощи исключающего «или») значения хешей элементов составляющих объект, которые также играют роль при сравнении объектов.

    class Mine: pass


Mine().__hash__() # например -9223363288920356208

Если класс не определил __eq__(), то не должен определять и данный метод, иначе экземпляры нельзя будет использовать в качестве элементов коллекций, использующих хеши.

Если класс представляет изменяемые объекты и в нём определён __eq__(), то не должен реализовывать и данный метод, ввиду того, что реализация коллекций, поддерживающих хеширование требует, чтобы хеш ключа был неизменяемым (если изменится хеш, то он будет отнесен не к той ячейке хеша).

Пользовательские классы уже реализуют метод __eq__() и данный. Реализация гарантирует, что любые объекты не равные между собой (конечно, исключая самих себя) и x.__hash__() возвращает соответствующее значение, такое, что x == y подразумевает одновременно x is y и hash(x) == hash(y).

+py2.6: Атрибуту __hash__ можно присвоить значение None, чтобы явно указать на то, что объекты не поддерживают хеширование.

Для классов, переопределивших __eq__(), но не данный метод, сам атрибут __hash__ будет неявно сброшен в None. Когда данный метод None, объекты будут поднимать TypeError, при попытке получения хеша для них, а также будут корректно определяться как не поддерживающие хеширование при проверке isinstance(obj, collections.Hashable).

Если требуется, чтобы класс переопределивший __eq__() сохранил реализацию данного метода, предлагаемую родительским классом, необходимо явно указать на это интерпретатору при помощи __hash__ = <Родитель>.__hash__.

Если требуется для класса, не переопределившего __eq__(), отключить возможность хеширования, нужно указать __hash__ = None. Если класс переопределил данный метод и при этом явно поднимает TypeError, то он будет неверно опознан как поддерживающий хеширование при проверке isinstance(obj, collections.Hashable).


На заметку
+py3.3: Рандомизация хешей включена по умолчанию. +py3.2.3: Смотрите также описание ключа запуска интерпретатора -R и переменной среды PYTHONHASHSEED.

По умолчанию значения, получаемые данным методом для строк, байтов и датверемени «подсолены» неким случайным значением. Не смотря на их неизменность внутри каждого отдельного процесса Python, уникальность не гарантируется между стартами Python.

Это сделано с целью защиты от атак отказа в обслуживании, вызываемых специально подготовленными данными, эксплуатирующими затратные вставки в словари со сложностью O(n^2). Более полная информация (англ.).

Смена хешей влияет на процесс итерирования в словарях, множествах и прочих отображениях. Питон никогда не гарантировал тот или иной порядок прохода (он обычно разнится для 32- и 64-битных сборок).

Внимание
+py2.5: метод может возвращать объект long integer, далее 32-битное целое получается их хеша данного объекта. hash() усекает значение, возвращаемое данным методом до размера Py_ssize_t. Обычно для 64-битных это 8 байт, и 4 байта для 32-битных сборок. Если метод должен функционировать на сборках с разной битностью, следует проверить размерность для этих сборок. Сделать это можно следующим образом python -c "import sys; print(sys.hash_info.width)".
Синонимы поиска: object.__hash__, object, __hash__, хеш, hashable
На заметку
Зарегистрированные пользователи могут публиковать свои мнения относительно Книг, Видео, Статей других авторов и прочего в разделе Обсуждений.