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); }
Warum ist es nicht das Beste?
Überraschenderweise ist boost::hash_combine nicht so optimal, wie es sein könnte scheinen.
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)); }
Diese Funktion nutzt:
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!