Метод hash () повертає хеш-значення об'єкта, якщо воно є.
Значення хешу - це просто цілі числа, які використовуються для швидкого порівняння ключів словника під час пошуку словника.
Внутрішньо hash()метод викликає __hash__()метод об'єкта, який встановлений за замовчуванням для будь-якого об'єкта. Ми розглянемо це пізніше.
Синтаксис hash()методу:
хеш (об'єкт)
Параметри hash ()
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 __ () | __хеш __ () | Опис | 
|---|---|---|
| Визначено (за замовчуванням) | Визначено (за замовчуванням) | Якщо залишити як є, усі об’єкти порівнюються нерівними (крім них самих) | 
| (Якщо змінюється) Визначено | Не слід визначати | Для реалізації хеш-колекції потрібно, щоб хеш-значення ключа було незмінним | 
| Не визначено | Не слід визначати | Якщо __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__()метод для хешу, оскільки він створюється за замовчуванням для всіх об’єктів.








