Метод 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__()
метод для хэша, поскольку он создается по умолчанию для всех объектов.