在C 中組合雜湊值的最佳方式:揭露boost::hash_combine
在 世界中,boosthash_combine經常是被譽為組合雜湊值的最佳方法。這就引出了一個問題:為什麼這是最好的方法?
理解 boost::hash_combine
boost::hash_combine 函數有兩個參數:一個種子值和一個要散列的值。然後,它使用一系列位元操作來組合這些值,從而產生一個包含先前雜湊的熵的新種子。
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); }
為什麼它不是最好的?
令人驚訝的是,boost::hash_combine 並不像看起來那麼最優。
更好的替代方案
另一種雜湊組合函數可以提供良好的分佈和熵保存:
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)); }
函數利用:
效能注意事項
雖然 boost::hash_combine 速度很快,但替代函數犧牲了一些速度來提高雜湊品質。然而,對於大多數應用程式來說,這種速度權衡通常可以忽略不計。
以上是為什麼 boost::hash_combine 不是在 C 中組合雜湊值的最佳方法?的詳細內容。更多資訊請關注PHP中文網其他相關文章!