Metode hash () mengembalikan nilai hash dari sebuah objek jika ada.
Nilai hash hanyalah bilangan bulat yang digunakan untuk membandingkan kunci kamus selama pencarian kamus dengan cepat.
Secara internal, hash()
metode memanggil __hash__()
metode suatu objek yang ditetapkan secara default untuk objek apa pun. Kami akan melihat ini nanti.
Sintaks hash()
metode adalah:
hash (objek)
Parameter hash ()
hash()
metode mengambil satu parameter:
- objek - objek yang nilai hashnya akan dikembalikan (integer, string, float)
Kembalikan nilai dari hash ()
hash()
metode mengembalikan nilai hash dari suatu objek jika ada.
Jika sebuah objek memiliki __hash__()
metode kustom , itu memotong nilai yang dikembalikan ke ukuran Py_ssize_t
.
Contoh 1: Bagaimana hash () bekerja dengan 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'))
Keluaran
Hash untuk 181 adalah: 181 Hash untuk 181.23 adalah: 530343892119126197 Hash untuk Python adalah: 2230730083538390373
Contoh 2: hash () untuk objek tupel yang tidak dapat diubah?
hash()
metode hanya bekerja untuk objek yang tidak dapat diubah sebagai tupel.
# tuple of vowels vowels = ('a', 'e', 'i', 'o', 'u') print('The hash is:', hash(vowels))
Keluaran
Hashnya adalah: -695778075465126279
Bagaimana hash () bekerja untuk objek kustom?
Seperti yang dinyatakan di atas, hash()
metode memanggil __hash__()
metode secara internal . Jadi, objek apa pun dapat menimpa __hash__()
nilai hash kustom.
Tetapi untuk implementasi hash yang benar, __hash__()
harus selalu mengembalikan integer. Dan, keduanya __eq__()
dan __hash__()
metode harus diterapkan.
Di bawah ini adalah kasus untuk __hash__()
penggantian yang benar .
__eq __ () | __hash __ () | Deskripsi |
---|---|---|
Didefinisikan (secara default) | Didefinisikan (secara default) | Jika dibiarkan apa adanya, semua objek dibandingkan tidak sama (kecuali dirinya sendiri) |
(Jika bisa berubah) Ditentukan | Tidak harus didefinisikan | Penerapan koleksi yang dapat di-hash membutuhkan nilai hash kunci yang tidak dapat diubah |
Tidak terdefinisikan | Tidak harus didefinisikan | Jika __eq__() tidak ditentukan, __hash__() sebaiknya tidak ditentukan. |
Didefinisikan | Tidak terdefinisikan | Instance kelas tidak akan dapat digunakan sebagai koleksi hashable. __hash __ () implikasi disetel ke None . Menambah TypeError pengecualian jika mencoba mengambil hash. |
Didefinisikan | Pertahankan dari Parent | __hash__ = .__hash__ |
Didefinisikan | Tidak ingin melakukan hash | __hash__ = None . Menambah pengecualian TypeError jika mencoba mengambil hash. |
Contoh 3: hash () untuk Objek Kustom dengan mengganti __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))
Keluaran
Hash adalah: 3785419240612877014
Catatan: Anda tidak perlu mengimplementasikan __eq__()
metode untuk hash karena ini dibuat secara default untuk semua objek.