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 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.








