Fungsi boost::hash_combine
template mengambil referensi ke hash (dipanggil seed
) dan objek v
. Menurut dokumen , ini digabungkan seed
dengan hash v
oleh
seed ^= hash_value(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
Saya dapat melihat bahwa ini deterministik. Saya mengerti mengapa XOR digunakan.
Saya yakin penambahan membantu dalam memetakan nilai yang sama secara terpisah sehingga tabel hash probing tidak akan rusak, tetapi dapatkah seseorang menjelaskan apa konstanta ajaib itu?
Jawaban:
Angka ajaib seharusnya 32 bit acak, di mana masing-masing kemungkinan besar adalah 0 atau 1, dan tanpa korelasi sederhana antara bit. Cara umum untuk menemukan string bit tersebut adalah dengan menggunakan ekspansi biner dari bilangan irasional; dalam hal ini, angka itu adalah kebalikan dari rasio emas:
phi = (1 + sqrt(5)) / 2 2^32 / phi = 0x9e3779b9
Jadi memasukkan nomor ini "secara acak" mengubah setiap bit benih; seperti yang Anda katakan, ini berarti nilai yang berurutan akan berjauhan. Termasuk versi bergeser dari seed lama memastikan bahwa, meskipun
hash_value()
memiliki kisaran nilai yang cukup kecil, perbedaan akan segera tersebar di semua bit.sumber
0x9e3779b97f4a7800
0x9e3779b97f4a7c15
.0x9e3779b97f4a7c16
? Maksudku, ini hanya diskon 1.Lihatlah artikel DDJ oleh Bob Jenkins dari tahun 1997 . Konstanta ajaib ("rasio emas") dijelaskan sebagai berikut:
sumber