Методът 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 __ () | __hash __ () | Описание |
---|---|---|
Дефинирано (по подразбиране) | Дефинирано (по подразбиране) | Ако бъдат оставени такива, каквито са, всички обекти се сравняват неравномерно (с изключение на себе си) |
(Ако е променливо) Определено | Не трябва да се дефинира | Внедряването на hashable collection изисква хеш стойността на ключа да бъде неизменна |
Не е определено | Не трябва да се дефинира | Ако __eq__() не е дефинирано, __hash__() не трябва да се дефинира. |
Определено | Не е определено | Екземплярите на класа няма да бъдат използвани като hashable collection. __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__()
метод за хеш, тъй като той е създаден по подразбиране за всички обекти.