Python-Hash ()

Die hash () -Methode gibt den Hashwert eines Objekts zurück, falls vorhanden.

Hash-Werte sind nur Ganzzahlen, mit denen Wörterbuchschlüssel während einer Wörterbuchsuche schnell verglichen werden.

Intern hash()ruft method die __hash__()Methode eines Objekts auf, die standardmäßig für jedes Objekt festgelegt ist. Wir werden uns das später ansehen.

Die Syntax der hash()Methode lautet:

 Hash (Objekt)

hash () Parameter

hash() Methode nimmt einen einzelnen Parameter:

  • object - das Objekt, dessen Hashwert zurückgegeben werden soll (Integer, String, Float)

Rückgabewert von hash ()

hash() Methode gibt den Hash-Wert eines Objekts zurück, falls es einen hat.

Wenn ein Objekt über eine benutzerdefinierte __hash__()Methode verfügt, wird der Rückgabewert auf die Größe von abgeschnitten Py_ssize_t.

Beispiel 1: Wie funktioniert hash () in 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'))

Ausgabe

 Hash für 181 ist: 181 Hash für 181,23 ist: 530343892119126197 Hash für Python ist: 2230730083538390373 

Beispiel 2: hash () für unveränderliches Tupelobjekt?

hash() Methode funktioniert nur für unveränderliche Objekte als Tupel.

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

Ausgabe

 Der Hash lautet: -695778075465126279

Wie funktioniert hash () für benutzerdefinierte Objekte?

Wie oben angegeben, hash()ruft die __hash__()Methode die Methode intern auf . Daher können alle Objekte __hash__()für benutzerdefinierte Hashwerte überschrieben werden.

Für eine korrekte Hash-Implementierung __hash__()sollte jedoch immer eine Ganzzahl zurückgegeben werden. Und beide __eq__()und __hash__()Methoden müssen implementiert werden.

Nachfolgend finden Sie die Fälle für eine korrekte __hash__()Übersteuerung.

Fälle für die benutzerdefinierte Hash-Implementierung für Objekte
__eq __ () __hash __ () Beschreibung
Definiert (standardmäßig) Definiert (standardmäßig) Wenn sie unverändert bleiben, werden alle Objekte ungleich verglichen (außer sich selbst).
(Wenn veränderlich) Definiert Sollte nicht definiert werden Für die Implementierung der Hashable-Sammlung muss der Hashwert des Schlüssels unveränderlich sein
Nicht definiert Sollte nicht definiert werden Wenn __eq__()nicht definiert, __hash__()sollte nicht definiert werden.
Definiert Nicht definiert Klasseninstanzen können nicht als Hash-Sammlung verwendet werden. __hash __ () Implizität gesetzt auf None. Löst eine TypeErrorAusnahme aus, wenn versucht wird, den Hash abzurufen.
Definiert Vom Elternteil behalten __hash__ = .__hash__
Definiert Will nicht hashen __hash__ = None. Löst eine TypeError-Ausnahme aus, wenn versucht wird, den Hash abzurufen.

Beispiel 3: hash () für benutzerdefinierte Objekte durch Überschreiben von __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))

Ausgabe

 Der Hash lautet: 3785419240612877014

Hinweis: Sie müssen keine __eq__()Methode für den Hash implementieren , da diese standardmäßig für alle Objekte erstellt wird.

Interessante Beiträge...