Питхон хасх ()

Метода хасх () враћа хеш вредност објекта ако га има.

Хасх вредности су само цели бројеви који се користе за брзо упоређивање кључева речника током претраживања речника.

Интерно, hash()метода позива __hash__()методу објекта која је подразумевано постављена за било који објекат. Ово ћемо погледати касније.

Синтакса hash()методе је:

 хеш (објекат)

параметри хасх ()

hash() метода узима један параметар:

  • објект - објекат чија хеш вредност треба да се врати (цео број, низ, флоат)

Повратна вредност из хеша ()

hash() метода враћа хеш вредност објекта ако га има.

Ако објекат има прилагођену __hash__()методу, он скраћује повратну вредност на величину Py_ssize_t.

Пример 1: Како хасх () ради у Питхону?

 # 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 Хеш за Питхон је: 2230730083538390373 

Пример 2: хасх () за непроменљиви објект корпице?

hash() метода делује само за непроменљиве објекте у облику корпе.

 # tuple of vowels vowels = ('a', 'e', 'i', 'o', 'u') print('The hash is:', hash(vowels))

Оутпут

 Хеш је: -695778075465126279

Како хасх () ради за прилагођене објекте?

Као што је горе речено, hash()метода интерно позива __hash__()метод. Дакле, било који објекти могу заменити __hash__()прилагођене хеш вредности.

Али за исправну имплементацију хеширања, __hash__()увек треба вратити цео број. И, __eq__()и __hash__()методе и методе морају бити примењене.

Испод су случајеви за исправно __hash__()поништавање.

Случајеви за прилагођену хеш примену за објекте
__ек __ () __хасх __ () Опис
Дефинисано (подразумевано) Дефинисано (подразумевано) Ако се оставе такви какви јесу, сви објекти се упоређују неједнако (осим себе)
(Ако је променљиво) Дефинисано Не би требало да буде дефинисано Имплементација хешабле колекције захтева да хеш вредност кључа буде непроменљива
Није дефинисано Не би требало да буде дефинисано Ако __eq__()није дефинисано, __hash__()не треба га дефинисати.
Дефинисано Није дефинисано Примери класе неће бити употребљиви као хасхабле цоллецтион. __хасх __ () подразумеваност постављена на None. Повећава TypeErrorизузетак ако се покуша добити хеш.
Дефинисано Задржи од родитеља __hash__ = .__hash__
Дефинисано Не жели да се хешира __hash__ = None. Повећава изузетак ТипеЕррор ако се покуша добити хеш.

Пример 3: хасх () за прилагођене објекте заменом __хасх __ ()

 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__()метод за хеш, јер се он подразумевано креира за све објекте.

Занимљиви Чланци...