Хеш Python ()

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

Цікаві статті...