Salah satu struktur data dasar dalam Python adalah kamus, yang memungkinkan seseorang untuk merekam "kunci" untuk mencari "nilai" dari jenis apa pun. Apakah ini diimplementasikan secara internal sebagai tabel hash? Jika tidak, apa itu?
187
dict
implementasi Python .Jawaban:
Ya, ini adalah pemetaan hash atau tabel hash. Anda dapat membaca deskripsi implementasi dict python, seperti yang ditulis oleh Tim Peters, di sini .
Itu sebabnya Anda tidak dapat menggunakan sesuatu yang 'tidak bisa diacak' sebagai kunci dict, seperti daftar:
Anda dapat membaca lebih lanjut tentang tabel hash atau memeriksa bagaimana hash diimplementasikan dalam python dan mengapa itu diterapkan seperti itu .
sumber
.keys()
dapat mengambil daftar kunci. Tabel hash asli tidak akan menyimpan kunci, hanya hash untuk menghemat ruang.Harus ada lebih banyak ke kamus Python daripada pencarian tabel pada hash (). Dengan eksperimen kasar saya menemukan tabrakan hash ini :
Namun itu tidak merusak kamus:
Cek kewarasan:
Mungkin ada tingkat pencarian lain di luar hash () yang menghindari tabrakan antara kunci kamus. Atau mungkin dict () menggunakan hash yang berbeda.
(Omong-omong, ini dalam Python 2.7.10. Kisah yang sama dalam Python 3.4.3 dan 3.5.0 dengan tabrakan di
hash(1.1) == hash(214748749.8)
.)sumber
hash('I wandered lonely as a cloud, that drifts on high o\'er vales and hills, when all at once, I saw a crowd, a host of golden daffodils.')
Ini memberikan desimal 19 digit --4037225020714749784
jika Anda cukup culun untuk peduli. Lanjutkan dengan kata-kata Anda sendiri, anak-anak, dan hash masih berupa angka 19 digit. Saya berasumsi ada batas pada panjang string yang bisa hash dengan Python, tapi aman untuk mengatakan lebih banyak string yang mungkin daripada nilai yang mungkin. Danhash(False)
= 0 omong-omong.Iya. Secara internal ini diimplementasikan sebagai hashing terbuka berdasarkan polinomial primitif atas Z / 2 ( sumber ).
sumber
Untuk memperluas penjelasan nosklo:
sumber