Python hash ()

Η μέθοδος hash () επιστρέφει την τιμή κατακερματισμού ενός αντικειμένου εάν έχει ένα.

Οι τιμές κατακερματισμού είναι απλώς ακέραιοι αριθμοί που χρησιμοποιούνται για γρήγορη σύγκριση πλήκτρων λεξικού κατά τη διάρκεια αναζήτησης λεξικού.

Εσωτερικά, η hash()μέθοδος καλεί τη __hash__()μέθοδο ενός αντικειμένου που ορίζεται από προεπιλογή για οποιοδήποτε αντικείμενο. Θα το δούμε αργότερα.

Η σύνταξη της hash()μεθόδου είναι:

 κατακερματισμός (αντικείμενο)

παράμετρος κατακερματισμού ()

hash() Η μέθοδος παίρνει μία μόνο παράμετρο:

  • αντικείμενο - το αντικείμενο του οποίου η τιμή κατακερματισμού πρόκειται να επιστραφεί (ακέραιος, συμβολοσειρά, float)

Τιμή επιστροφής από κατακερματισμό ()

hash() Η μέθοδος επιστρέφει την τιμή κατακερματισμού ενός αντικειμένου εάν έχει ένα.

Εάν ένα αντικείμενο έχει προσαρμοσμένη __hash__()μέθοδο, περικόπτει την τιμή επιστροφής στο μέγεθος του Py_ssize_t.

Παράδειγμα 1: Πώς λειτουργεί το hash () στο 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'))

Παραγωγή

 Το Hash for 181 είναι: 181 Hash για το 181.23 είναι: 530343892119126197 Το Hash for Python είναι: 2230730083538390373 

Παράδειγμα 2: hash () για αμετάβλητο αντικείμενο tuple;

hash() Η μέθοδος λειτουργεί μόνο για αμετάβλητα αντικείμενα ως πλειάδα.

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

Παραγωγή

 Ο κατακερματισμός είναι: -695778075465126279

Πώς λειτουργεί το hash () για προσαρμοσμένα αντικείμενα;

Όπως αναφέρθηκε παραπάνω, η hash()μέθοδος καλεί εσωτερικά τη __hash__()μέθοδο. Έτσι, τυχόν αντικείμενα μπορούν να αντικαταστήσουν __hash__()τις προσαρμοσμένες τιμές κατακερματισμού.

Αλλά για σωστή εφαρμογή κατακερματισμού, __hash__()θα πρέπει πάντα να επιστρέφει έναν ακέραιο. Και, __eq__()και οι δύο και οι __hash__()μέθοδοι πρέπει να εφαρμοστούν.

Ακολουθούν οι περιπτώσεις για σωστή __hash__()παράκαμψη.

Περιπτώσεις για προσαρμοσμένη εφαρμογή κατακερματισμού για αντικείμενα
__eq __ () __χασίσι__() Περιγραφή
Ορίζεται (από προεπιλογή) Ορίζεται (από προεπιλογή) Εάν αφεθεί ως έχει, όλα τα αντικείμενα συγκρίνονται άνισα (εκτός από αυτά)
(Εάν μεταβάλλεται) Ορίζεται Δεν πρέπει να οριστεί Η εφαρμογή της συλλογής κατακερματισμού απαιτεί την τιμή κατακερματισμού του κλειδιού να είναι αμετάβλητη
Μη καθορισμένο Δεν πρέπει να οριστεί Εάν __eq__()δεν ορίζεται, __hash__()δεν πρέπει να οριστεί.
Ορίζεται Μη καθορισμένο Οι παρουσίες τάξης δεν θα μπορούν να χρησιμοποιηθούν ως συλλογή κατακερματισμού. Το __hash __ () ορίστηκε η εμπλοκή σε None. Αυξάνει την TypeErrorεξαίρεση εάν προσπαθεί να ανακτήσει το κατακερματισμό.
Ορίζεται Διατήρηση από τον γονέα __hash__ = .__hash__
Ορίζεται Δεν θέλει να κατακερματιστεί __hash__ = None. Αυξάνει την εξαίρεση TypeError εάν προσπαθήσει να ανακτήσει τον κατακερματισμό.

Παράδειγμα 3: κατακερματισμός () για προσαρμοσμένα αντικείμενα με παράκαμψη __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))

Παραγωγή

 Ο κατακερματισμός είναι: 3785419240612877014

Σημείωση: Δεν χρειάζεται να εφαρμόσετε __eq__()μέθοδο για το κατακερματισμό, καθώς δημιουργείται από προεπιλογή για όλα τα αντικείμενα.

ενδιαφέροντα άρθρα...