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.
disable
saat menyetelnya ke 0? Saya tidak melihat perbedaan efektif untuk menyetelnya ke nomor benih stabil lama, kecuali saya melewatkan sesuatu. Yang saya maksud adalah ketika saya menggunakanPYTHONHASHSEED=12345
saya mendapatkan hash yang sama untuk string yang sama bahkan di seluruh sesi - hal yang sama terjadi saat saya menggunakanPYTHONHASHSEED=0
- hash untuk string yang sama akan sama di seluruh sesi (meskipun berbeda dengan 12345, tapi itu jelas, begitulah seed kerja).0
tidak ada seed sama sekali dan hash untuk objek sama dengan yang dihasilkan di versi Python lama tanpa dukungan hashseed.Pengacakan hash diaktifkan secara default di Python 3 . Ini adalah fitur keamanan:
Di versi sebelumnya dari 2.6.8, Anda dapat mengaktifkannya di baris perintah dengan -R, atau opsi lingkungan PYTHONHASHSEED .
Anda dapat mematikannya dengan menyetel
PYTHONHASHSEED
ke nol.sumber
hash () adalah Python built-in fungsi dan menggunakannya untuk menghitung nilai hash untuk objek , bukan untuk string atau num.
Anda dapat melihat detailnya di halaman ini: https://docs.python.org/3.3/library/functions.html#hash .
dan nilai hash () berasal dari metode __hash__ objek. Dokter mengatakan yang berikut:
Itulah mengapa Anda memiliki nilai hash yang berbeda untuk string yang sama di konsol yang berbeda.
Apa yang Anda terapkan bukanlah cara yang baik.
Saat Anda ingin menghitung nilai hash string, gunakan saja hashlib
hash () bertujuan untuk mendapatkan nilai hash objek, bukan mengaduk.
sumber
hash()
sangat valid untuk nilai string atau numerik. Anda mengacaukan ini dengan__hash__
metode kustom, yang digunakan olehhash()
untuk menyediakan implementasi kustom dari nilai hash.