Функція hash() повертає хеш-значення об’єкта, якщо воно в нього є. Хеш-значення — це просто цілі числа, які використовуються для порівняння ключів словника під час його швидкого перегляду. Наприклад:
|
1 2 3 4 5 |
text = 'Python Programming' # Обчислюємо хеш-значення змінної text hash_value = hash(text) print(hash_value) |
Результат:
-966697084172663693
Синтаксис функції hash()
|
1 |
hash(object) |
Параметри функції hash()
Функція hash() приймає один параметр:
object — об’єкт, хеш-значення якого повертається (ціле число, рядок, число з плаваючою крапкою).
Всередині функція hash() викликає метод об’єкта __hash__(), який встановлений за замовчуванням для кожного об’єкта.
Значення, яке повертає функція hash()
Функція hash() повертає хеш-значення об’єкта.
Приклад №1: Як працює функція hash() в Python?
|
1 2 3 4 5 6 7 8 |
# Хеш для цілого числа не змінюється print('Hash for 181 is:', hash(181)) # Хеш для десяткового числа print('Hash for 181.23 is:',hash(181.23)) # Хеш для рядка print('Hash for Python is:', hash('Python')) |
Результат:
Hash for 181 is: 181
Hash for 181.23 is: 530343892119126197
Hash for Python is: 2230730083538390373
Приклад №2: Функція hash() для незмінного об’єкта кортежу
Функція hash() працює тільки з незмінними об’єктами, наприклад, з кортежами:
|
1 2 3 4 |
# Кортеж голосних vowels = ('a', 'e', 'i', 'o', 'u') print('The hash is:', hash(vowels)) |
Результат:
The hash is: -695778075465126279
Як працює функція hash() для об’єктів користувача?
Як вказано вище, функція hash() внутрішньо викликає метод об’єкта __hash__(). Таким чином, будь-які об’єкти можуть перевизначити метод __hash__() для користувацьких хеш-значень. Але для правильної реалізації хешу метод __hash__() повинен повертати ціле число. При чому повинні бути реалізовані обидва методи: __eq__() та __hash__().
Нижче наведено приклади правильного перевизначення методів __hash__() та __eq__().
| __eq__() | __hash__() | Опис |
| Визначений (за замовчуванням) | Визначений (за замовчуванням) | Якщо залишити все як є, всі об’єкти порівнюються нерівними. |
| (якщо змінюється) Визначений | Не слід визначати | Реалізація хешованої колекції вимагає, щоб хеш-значення ключа було незмінним. |
| Не визначений | Не слід визначати | Якщо метод __eq__() не визначений, то метод __hash__() не слід визначати. |
| Визначений | Не визначений | Екземпляри класу не можна буде використати як хешовану колекцію. Для методу __hash__() встановлено значення None. При спробі отримати хеш генерується виняток TypeError. |
| Визначений | Отриманий від батьківського методу | __hash__ = <ParentClass>.__hash__ |
| Визначений | Хешування не виконується. | __hash__ = None. При спробі отримати хеш генерується виняток TypeError. |
Приклад №3: Функція hash() для об’єктів користувача шляхом перевизначення методу __hash__()
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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)) |
Результат:
The hash is:
3785419240612877014
Примітка: Нам не потрібно реалізовувати метод __eq__() для хешу, оскільки він створюється за замовчуванням для всіх об’єктів.

(3 оцінок, середня: 4,67 з 5)