Selanjutnya, kami menggunakan N4140 (Standar C ++ 14).
Menurut § 17.6.3.4 Persyaratan hash ,
Nilai yang dikembalikan hanya akan bergantung pada argumen
k
selama durasi program .[Catatan: Demikian semua evaluasi ekspresi
h(k)
dengan nilai yang sama untukk
menghasilkan hasil yang sama untuk eksekusi program yang diberikan . - catatan akhir]
dan § 20.9.12 Kelas Template hash mengatakan
...
Instansiasi
hash<Key>
akan:(1.1) - memenuhi persyaratan Hash (17.6.3.4) ...
(1.2) - ...
Ini berarti nilai hash value
(yaitu hash<decltype(value)>(value)
) dapat mengambil nilai yang berbeda jika Anda me-restart program.
Tapi kenapa? Batasan ini bukan dalam Standar C ++ 11, tetapi dalam Standar C ++ 14, C ++ 17 dan C ++ 20. Sebagai pengguna (bukan pengembang STL), akan sangat berguna jika std::hash
bersifat deterministik. Apakah ada kesulitan matematika dalam mengimplementasikan fungsi hash deterministik? Tetapi fungsi hash yang kita gunakan sehari-hari (mis. Usang md5sum
atau lebih aman sha256
) semuanya deterministik. Apakah ada masalah efisiensi?
sumber
Jawaban:
Tidak perlu fungsi hash untuk menjadi deterministik antara run, tetapi Anda masih dapat memberikan hash Anda sendiri, misalnya untuk wadah yang tidak berurutan jika itu adalah perilaku yang Anda andalkan.
Adapun alasannya, cppreference mengatakan:
Jika
Hash
persyaratan mengatakan itu deterministik, maka Anda tidak akan dapat memberikan hash asin tanpa melanggar persyaratan.Inilah penjelasan sebenarnya mengapa
sumber
Jawaban ini (dan tautan di dalamnya) yang disarankan oleh @NathanOliver pada akhirnya sangat membantu. Biarkan saya mengutip bagian-bagian penting.
PS
Saya baru saja googled "dos tabel hash" dan menemukan halaman informatif: Saat ketika Anda menyadari setiap server di dunia rentan .
sumber