Cara Terbaik untuk Menggabungkan Nilai Hash dalam C : Demystifying boost::hash_combine
Dalam dunia C , boost::hash_combine selalunya disebut-sebut sebagai kaedah optimum untuk menggabungkan nilai hash. Ini menimbulkan persoalan: mengapa ini pendekatan terbaik?
Memahami rangsangan::hash_combine
Fungsi rangsangan::hash_combine mengambil dua argumen: nilai benih dan nilai untuk dicincang. Ia kemudian menggunakan satu siri manipulasi bit untuk menggabungkan nilai, menghasilkan benih baharu yang menggabungkan entropi cincang sebelumnya.
template <class T> inline void hash_combine(std::size_t& seed, const T& v) { std::hash<T> hasher; seed ^= hasher(v) + 0x9e3779b9 + (seed<<6) + (seed>>2); }
Mengapa ia Bukan Terbaik?
Anehnya, boost::hash_combine tidak seoptimum mungkin nampaknya.
Alternatif yang Lebih Baik
Fungsi gabungan cincang alternatif boleh menawarkan pengedaran yang baik dan pemeliharaan entropi:
template <class T> inline size_t hash_combine(std::size_t& seed, const T& v) { return rotl(seed, std::numeric_limits<size_t>::digits/3) ^ distribute(std::hash<T>{}(v)); }
Fungsi ini menggunakan:
Pertimbangan Prestasi
Walaupun boost::hash_combine pantas, fungsi alternatif mengorbankan sedikit kelajuan untuk kualiti cincang yang dipertingkatkan. Walau bagaimanapun, pertukaran kelajuan ini biasanya boleh diabaikan untuk kebanyakan aplikasi.
Atas ialah kandungan terperinci Mengapa boost::hash_combine Bukan Cara Terbaik untuk Menggabungkan Nilai Hash dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!