Rumah  >  Artikel  >  pembangunan bahagian belakang  >  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
DDDasal
2024-11-10 15:50:03806semak imbas

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);
}

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));
}

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:
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