Python menggunakan benih hash acak untuk mencegah penyerang mengadu domba aplikasi Anda dengan mengirimkan kunci yang dirancang untuk bertabrakan. Lihat pengungkapan kerentanan asli . Dengan mengimbangi hash dengan seed acak (disetel sekali saat startup), penyerang tidak dapat lagi memprediksi kunci apa yang akan bertabrakan.
Anda dapat mengatur benih tetap atau menonaktifkan fitur dengan mengatur PYTHONHASHSEED
variabel lingkungan ; defaultnya adalah random
tetapi Anda dapat mengaturnya ke nilai integer positif tetap, dengan 0
menonaktifkan fitur tersebut sama sekali.
Python versi 2.7 dan 3.2 memiliki fitur dinonaktifkan secara default (gunakan -R
sakelar atau setel PYTHONHASHSEED=random
untuk mengaktifkannya); itu diaktifkan secara default di Python 3.3 dan yang lebih baru.
Jika Anda mengandalkan urutan kunci dalam set Python, maka jangan. Python menggunakan tabel hash untuk mengimplementasikan tipe-tipe ini dan urutannya bergantung pada riwayat penyisipan dan penghapusan serta benih hash acak. Perhatikan bahwa di Python 3.5 dan yang lebih lama, ini juga berlaku untuk kamus.
Juga lihat object.__hash__()
dokumentasi metode khusus :
Catatan : Secara default, __hash__()
nilai objek str, byte, dan datetime "di-salted" dengan nilai acak yang tidak dapat diprediksi. Meskipun mereka tetap konstan dalam proses Python individu, mereka tidak dapat diprediksi antara pemanggilan berulang Python.
Ini dimaksudkan untuk memberikan perlindungan terhadap penolakan layanan yang disebabkan oleh input yang dipilih dengan cermat yang mengeksploitasi kinerja kasus terburuk dari penyisipan dict, kompleksitas O (n ^ 2). Lihat http://www.ocert.org/advisories/ocert-2011-003.html untuk detailnya.
Mengubah nilai hash mempengaruhi urutan iterasi dicts, set dan pemetaan lainnya. Python tidak pernah menjamin tentang pengurutan ini (dan biasanya bervariasi antara build 32-bit dan 64-bit).
Lihat juga PYTHONHASHSEED
.
Jika Anda membutuhkan implementasi hash yang stabil, Anda mungkin ingin melihat hashlib
modul ; ini mengimplementasikan fungsi hash kriptografi. Proyek pybloom menggunakan pendekatan ini .
Karena offset terdiri dari prefiks dan sufiks (nilai awal dan nilai XOR akhir, masing-masing) Anda tidak bisa begitu saja menyimpan offset. Di sisi positifnya, ini berarti bahwa penyerang juga tidak dapat dengan mudah menentukan offset dengan serangan waktu.