Hash Python ()

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 .

Kasus untuk implementasi hash kustom untuk objek
__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 TypeErrorpengecualian 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.

Artikel yang menarik...