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








