Хеш Python ()

Метод hash () возвращает хеш-значение объекта, если оно есть.

Значения хэша - это просто целые числа, которые используются для быстрого сравнения ключей словаря во время поиска в словаре.

Внутри hash()метод вызывает __hash__()метод объекта, который установлен по умолчанию для любого объекта. Мы посмотрим на это позже.

Синтаксис hash()метода:

 хэш (объект)

Параметры hash ()

hash() метод принимает единственный параметр:

  • object - объект, хеш-значение которого должно быть возвращено (целое число, строка, число с плавающей запятой)

Возвращаемое значение из hash ()

hash() метод возвращает хеш-значение объекта, если оно есть.

Если у объекта есть собственный __hash__()метод, он обрезает возвращаемое значение до размера Py_ssize_t.

Пример 1. Как hash () работает в Python?

 # hash for integer unchanged print('Hash for 181 is:', hash(181)) # hash for decimal print('Hash for 181.23 is:',hash(181.23)) # hash for string print('Hash for Python is:', hash('Python'))

Вывод

 Хэш для 181: 181 Хеш для 181,23: 530343892119126197 Хеш для Python: 2230730083538390373 

Пример 2: hash () для неизменяемого объекта кортежа?

hash() метод работает только для неизменяемых объектов как кортеж.

 # tuple of vowels vowels = ('a', 'e', 'i', 'o', 'u') print('The hash is:', hash(vowels))

Вывод

 Хеш: -695778075465126279

Как hash () работает с настраиваемыми объектами?

Как указано выше, hash()метод внутренне вызывает __hash__()метод. Таким образом, любые объекты можно переопределить __hash__()для пользовательских значений хэша.

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

Ниже приведены случаи правильной __hash__()переопределения.

Кейсы для реализации пользовательского хэша для объектов
__eq __ () __hash __ () Описание
Определено (по умолчанию) Определено (по умолчанию) Если оставить как есть, все объекты сравниваются неравно (кроме самих себя)
(Если изменяемый) Определен Не следует определять Реализация хешируемой коллекции требует, чтобы хеш-значение ключа было неизменным
Не определено Не следует определять Если __eq__()не определено, __hash__()не должно определяться.
Определенный Не определено Экземпляры классов нельзя будет использовать как хешируемую коллекцию. __hash __ () неявность установлена ​​на None. Вызывает TypeErrorисключение при попытке получить хэш.
Определенный Сохранить от родителя __hash__ = .__hash__
Определенный Не хочет хешировать __hash__ = None. Вызывает исключение TypeError при попытке получить хэш.

Пример 3: hash () для настраиваемых объектов путем переопределения __hash __ ()

 class Person: def __init__(self, age, name): self.age = age self.name = name def __eq__(self, other): return self.age == other.age and self.name == other.name def __hash__(self): print('The hash is:') return hash((self.age, self.name)) person = Person(23, 'Adam') print(hash(person))

Вывод

 Хеш: 3785419240612877014

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

Интересные статьи...