Rumah > pembangunan bahagian belakang > C++ > Mengapa boost::hash_combine Bukan Cara Terbaik untuk Menggabungkan Nilai Hash dalam C ?

Mengapa boost::hash_combine Bukan Cara Terbaik untuk Menggabungkan Nilai Hash dalam C ?

DDD
Lepaskan: 2024-11-10 15:50:03
asal
871 orang telah melayarinya

Why is boost::hash_combine Not the Best Way to Combine Hash Values in C  ?

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);
}
Salin selepas log masuk

Mengapa ia Bukan Terbaik?

Anehnya, boost::hash_combine tidak seoptimum mungkin nampaknya.

  1. Pengagihan Lemah: Apabila digunakan bersama-sama dengan pengedaran fungsi cincang yang kurang baik seperti std::hash, boost::hash_combine boleh mempamerkan kadar perlanggaran yang tinggi.
  2. Kehilangan Entropi: Jika semua entropi tertumpu dalam benih, beberapa entropi mungkin hilang dalam pengiraan.

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));
}
Salin selepas log masuk

Fungsi ini menggunakan:

  • Putaran Bit: Memutar benih untuk menjadikan susunan pengiraan cincang relevan.
  • Pengedaran Baik: Menggunakan pengedaran tersuai berfungsi untuk pengedaran cincang yang lebih baik.
  • Memelihara Entropi: Putar benih sebelum bergabung untuk mengelakkan kehilangan entropi.

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!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan