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