Функція hash() в Python

 2945

Функція hash() повертає хеш-значення об’єкта, якщо воно в нього є. Хеш-значення — це просто цілі числа, які використовуються для порівняння ключів словника під час його швидкого перегляду. Наприклад:

Результат:

-966697084172663693

Синтаксис функції hash()

Параметри функції hash()

Функція hash() приймає один параметр:

   object — об’єкт, хеш-значення якого повертається (ціле число, рядок, число з плаваючою крапкою).

Всередині функція hash() викликає метод об’єкта __hash__(), який встановлений за замовчуванням для кожного об’єкта.

Значення, яке повертає функція hash()

Функція hash() повертає хеш-значення об’єкта.

Приклад №1: Як працює функція hash() в Python?

Результат:

Hash for 181 is: 181
Hash for 181.23 is: 530343892119126197
Hash for Python is: 2230730083538390373

Приклад №2: Функція hash() для незмінного об’єкта кортежу

Функція hash() працює тільки з незмінними об’єктами, наприклад, з кортежами:

Результат:

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__()

Результат:

The hash is:
3785419240612877014

Примітка: Нам не потрібно реалізовувати метод __eq__() для хешу, оскільки він створюється за замовчуванням для всіх об’єктів.

Оцінити статтю:

1 Зірка2 Зірки3 Зірки4 Зірки5 Зірок (3 оцінок, середня: 4,67 з 5)
Завантаження...

Залишити відповідь

Ваш E-mail не буде опублікований. Обов'язкові поля відмічені *