Heim > Backend-Entwicklung > C++ > Hauptteil

Warum ist boost::hash_combine nicht die beste Möglichkeit, Hash-Werte in C zu kombinieren?

DDD
Freigeben: 2024-11-10 15:50:03
Original
798 Leute haben es durchsucht

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

Beste Möglichkeit, Hash-Werte in C zu kombinieren: Entmystifizierung von boost::hash_combine

In der Welt von C wird boost::hash_combine oft verwendet wird als optimale Methode zur Kombination von Hashwerten angepriesen. Dies wirft die Frage auf: Warum ist dies der beste Ansatz?

Boost::hash_combine verstehen

Die Funktion boost::hash_combine benötigt zwei Argumente: einen Startwert und einen Wert, der gehasht werden soll. Anschließend verwendet es eine Reihe von Bitmanipulationen, um die Werte zu kombinieren, was zu einem neuen Startwert führt, der die Entropie des vorherigen Hashs enthält.

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);
}
Nach dem Login kopieren

Warum ist es nicht das Beste?

Überraschenderweise ist boost::hash_combine nicht so optimal, wie es sein könnte scheinen.

  1. Schlechte Verteilung: Bei Verwendung in Verbindung mit schlecht verteilenden Hash-Funktionen wie std::hash kann boost::hash_combine eine hohe Kollisionsrate aufweisen.
  2. Entropieverlust: Wenn die gesamte Entropie im Samen konzentriert ist, kann etwas Entropie auftreten in der Berechnung verloren gehen.

Eine bessere Alternative

Eine alternative Hash-Kombinationsfunktion kann sowohl eine gute Verteilung als auch eine Entropieerhaltung bieten:

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));
}
Nach dem Login kopieren

Diese Funktion nutzt:

  • Bit-Rotation:Rotiert das Seed, um die Hash-Berechnungsreihenfolge relevant zu machen.
  • Gute Verteilung:Verwendet eine benutzerdefinierte Verteilungsfunktion für eine bessere Hash-Verteilung.
  • Erhält die Entropie:Rotiert das Saatgut vor dem Kombinieren, um Entropieverlust zu verhindern.

Leistung Überlegungen

Während boost::hash_combine schnell ist, opfert die alternative Funktion etwas Geschwindigkeit für eine verbesserte Hash-Qualität. Allerdings ist dieser Geschwindigkeitskompromiss für die meisten Anwendungen im Allgemeinen vernachlässigbar.

Das obige ist der detaillierte Inhalt vonWarum ist boost::hash_combine nicht die beste Möglichkeit, Hash-Werte in C zu kombinieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage