Python hash ()

Kaedah hash () mengembalikan nilai hash objek jika mempunyai satu.

Nilai Hash hanyalah bilangan bulat yang digunakan untuk membandingkan kekunci kamus semasa pencarian kamus dengan cepat.

Secara dalaman, hash()kaedah memanggil __hash__()kaedah objek yang ditetapkan secara lalai untuk objek apa pun. Kami akan melihatnya kemudian.

Sintaks hash()kaedah adalah:

 hash (objek)

Parameter hash ()

hash() kaedah mengambil satu parameter:

  • objek - objek yang nilai hashnya akan dikembalikan (integer, string, float)

Nilai pulangan dari hash ()

hash() kaedah mengembalikan nilai hash objek jika mempunyai satu.

Sekiranya objek mempunyai __hash__()kaedah khusus , ia akan memangkas nilai kembali ke ukuran Py_ssize_t.

Contoh 1: Bagaimana hash () berfungsi di 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'))

Pengeluaran

 Hash untuk 181 ialah: 181 Hash untuk 181.23 ialah: 530343892119126197 Hash untuk Python ialah: 2230730083538390373 

Contoh 2: hash () untuk objek tuple yang tidak berubah?

hash() kaedah hanya berfungsi untuk objek yang tidak berubah sebagai tuple.

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

Pengeluaran

 Hash adalah: -695778075465126279

Bagaimana hash () berfungsi untuk objek tersuai?

Seperti yang dinyatakan di atas, hash()kaedah memanggil __hash__()kaedah. Jadi, sebarang objek boleh menggantikan __hash__()nilai hash tersuai.

Tetapi untuk pelaksanaan hash yang betul, __hash__()harus selalu mengembalikan bilangan bulat. Dan, kedua __eq__()- duanya dan __hash__()kaedah mesti dilaksanakan.

Berikut adalah kes-kes untuk __hash__()penggantian yang betul .

Kes untuk pelaksanaan hash khusus untuk objek
__eq __ () __hash __ () Penerangan
Ditakrifkan (secara lalai) Ditakrifkan (secara lalai) Sekiranya dibiarkan seperti itu, semua objek membandingkan tidak sama (kecuali mereka sendiri)
(Sekiranya boleh berubah) Ditakrifkan Tidak boleh ditakrifkan Pelaksanaan pengumpulan hashable memerlukan nilai hash kunci tidak berubah
Tidak ditentukan Tidak boleh ditakrifkan Sekiranya __eq__()tidak ditakrifkan, __hash__()tidak boleh ditakrifkan.
Ditakrifkan Tidak ditentukan Contoh kelas tidak akan dapat digunakan sebagai koleksi hashable. __hash __ () implikasinya ditetapkan kepada None. Menimbulkan TypeErrorpengecualian jika cuba mengambil hash.
Ditakrifkan Kekal dari Ibu Bapa __hash__ = .__hash__
Ditakrifkan Tidak mahu hash __hash__ = None. Meningkatkan pengecualian TypeError jika cuba mengambil hash.

Contoh 3: hash () untuk Objek Tersuai dengan mengesampingkan __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))

Pengeluaran

 Hash adalah: 3785419240612877014

Catatan: Anda tidak perlu menerapkan __eq__()kaedah untuk hash kerana ia dibuat secara lalai untuk semua objek.

Artikel menarik...