object.__hash__
Позволяет настраивать хеширование объектов, а также управлять его возможностью.
object.__hash__(self)
self -- Ссылка на экземпляр.
Вызывается встроенной функцией hash(), а также для операций над элементами коллекций, использующих хеши, включая множества (set), статичные множества (frozenset), словари (dict).
Единственным требованием является то, чтобы объекты являющиеся равными имели одинаковый хеш. Рекомендуется неким образом смешать (например, при помощи исключающего «или») значения хешей элементов составляющих объект, которые также играют роль при сравнении объектов.
Если класс не определил __eq__(), то не должен определять и данный метод, иначе экземпляры нельзя будет использовать в качестве элементов коллекций, использующих хеши.
Если класс представляет изменяемые объекты и в нём определён __eq__(), то не должен реализовывать и данный метод, ввиду того, что реализация коллекций, поддерживающих хеширование требует, чтобы хеш ключа был неизменяемым (если изменится хеш, то он будет отнесен не к той ячейке хеша).
Пользовательские классы уже реализуют метод __eq__() и данный. Реализация гарантирует, что любые объекты не равные между собой (конечно, исключая самих себя) и
+py2.6: Атрибуту
Для классов, переопределивших __eq__(), но не данный метод, сам атрибут
Если требуется, чтобы класс переопределивший __eq__() сохранил реализацию данного метода, предлагаемую родительским классом, необходимо явно указать на это интерпретатору при помощи
Если требуется для класса, не переопределившего __eq__(), отключить возможность хеширования, нужно указать
По умолчанию значения, получаемые данным методом для строк, байтов и датверемени «подсолены» неким случайным значением. Не смотря на их неизменность внутри каждого отдельного процесса Python, уникальность не гарантируется между стартами Python.
Это сделано с целью защиты от атак отказа в обслуживании, вызываемых специально подготовленными данными, эксплуатирующими затратные вставки в словари со сложностью O(n^2). Более полная информация (англ.).
Смена хешей влияет на процесс итерирования в словарях, множествах и прочих отображениях. Питон никогда не гарантировал тот или иной порядок прохода (он обычно разнится для 32- и 64-битных сборок).
Единственным требованием является то, чтобы объекты являющиеся равными имели одинаковый хеш. Рекомендуется неким образом смешать (например, при помощи исключающего «или») значения хешей элементов составляющих объект, которые также играют роль при сравнении объектов.
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
В разделе «object (объект)»:
file (файл)
object.__add__
object.__bool__
object.__call__
object.__ceil__
object.__class__
object.__cmp__
object.__contains__
object.__copy__
object.__deepcopy__
object.__del__
object.__delattr__
object.__delete__
object.__delitem__
object.__delslice__
object.__dir__
object.__enter__
object.__eq__
object.__exit__
object.__floor__
object.__format__
object.__ge__
object.__get__
object.__getattr__
object.__getattribute__
object.__getitem__
object.__getslice__
object.__getstate__
object.__gt__
object.__init__
object.__init_subclass__
object.__iter__
object.__le__
object.__len__
object.__lt__
object.__missing__
object.__ne__
object.__new__
object.__next__
object.next
object.__nonzero__
object.__qualname__
object.__rcmp__
object.__repr__
object.__reversed__
object.__set__
object.__setattr__
object.__setitem__
object.__set_name__
object.__setslice__
object.__setstate__
object.__slots__
object.__str__
object.__sub__
object.__subclasses__
object.__unicode__
property (свойство)
Protocols (протоколы)
slice (срез)
Встроенные исключения
На заметку
Зарегистрированные пользователи могут публиковать свои мнения относительно Книг, Видео, Статей других авторов и прочего в разделе Обсуждений.