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 TypeError pengecualian 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.