Hash w Pythonie ()

Metoda hash () zwraca wartość skrótu obiektu, jeśli taki posiada.

Wartości skrótu to tylko liczby całkowite używane do szybkiego porównywania kluczy słownika podczas wyszukiwania w słowniku.

Wewnętrznie hash()metoda wywołuje __hash__()metodę obiektu, która jest domyślnie ustawiona dla dowolnego obiektu. Przyjrzymy się temu później.

Składnia hash()metody to:

 hash (obiekt)

hash () Parametry

hash() metoda przyjmuje jeden parametr:

  • obiekt - obiekt, którego wartość hash ma zostać zwrócona (liczba całkowita, ciąg znaków, zmiennoprzecinkowa)

Wartość zwracana z hash ()

hash() metoda zwraca wartość skrótu obiektu, jeśli taki posiada.

Jeśli obiekt ma niestandardową __hash__()metodę, obcina zwracaną wartość do rozmiaru Py_ssize_t.

Przykład 1: Jak działa hash () w Pythonie?

 # 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'))

Wynik

 Hash dla 181 to: 181 Hash dla 181,23 to: 530343892119126197 Hash dla Pythona to: 2230730083538390373 

Przykład 2: hash () dla niezmiennego obiektu krotki?

hash() metoda działa tylko dla niezmiennych obiektów jako krotki.

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

Wynik

 Wartość skrótu to: -695778075465126279

Jak działa funkcja hash () w przypadku obiektów niestandardowych?

Jak wspomniano powyżej, hash()method wewnętrznie wywołuje __hash__()metodę method. Zatem dowolne obiekty mogą przesłonić __hash__()niestandardowe wartości skrótu.

Ale dla poprawnej implementacji skrótu, __hash__()zawsze powinien zwracać liczbę całkowitą. I zarówno __eq__()i __hash__()metody muszą być wdrożone.

Poniżej znajdują się przypadki poprawnego __hash__()zastąpienia.

Przypadki dla niestandardowej implementacji skrótu dla obiektów
__eq __ () __haszysz__() Opis
Zdefiniowano (domyślnie) Zdefiniowano (domyślnie) Jeśli pozostawisz tak, jak jest, wszystkie obiekty są nierówne (z wyjątkiem siebie)
(Jeśli zmienny) Zdefiniowany Nie powinno być definiowane Implementacja kolekcji z możliwością mieszania wymaga, aby wartość skrótu klucza była niezmienna
Nie określono Nie powinno być definiowane Jeśli __eq__()nie jest zdefiniowane, __hash__()nie powinno być definiowane.
Zdefiniowany Nie określono Instancje klas nie będą używane jako kolekcja z możliwością mieszania. Implikacja __hash __ () ustawiona na None. Podnosi TypeErrorwyjątek, jeśli próbujesz pobrać skrót.
Zdefiniowany Zachowaj od rodzica __hash__ = .__hash__
Zdefiniowany Nie chce haszować __hash__ = None. Podnosi wyjątek TypeError w przypadku próby pobrania skrótu.

Przykład 3: hash () dla obiektów niestandardowych przez zastąpienie __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))

Wynik

 Wartość skrótu to: 3785419240612877014

Uwaga: Nie musisz implementować __eq__()metody dla skrótu, ponieważ jest ona tworzona domyślnie dla wszystkich obiektów.

Interesujące artykuły...