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.
__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 TypeError Ausnahme 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.