add a hash combine implementation that has some minor performance guarantees
This commit is contained in:
parent
31fbf99109
commit
2b2ed50721
@ -32,13 +32,41 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
|
|
||||||
#include <functional>
|
#include <functional>
|
||||||
|
|
||||||
|
// this is largely inspired by boost's hash combine
|
||||||
|
template<typename T>
|
||||||
|
inline void hash_combine(std::size_t &seed, const T& val)
|
||||||
|
{
|
||||||
|
seed ^= std::hash<T>()(val) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
inline void hash_val(std::size_t &seed, const T& val)
|
||||||
|
{
|
||||||
|
hash_combine(seed, val);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T, typename ... Types>
|
||||||
|
inline void hash_val(std::size_t &seed, const T& val, const Types& ... args)
|
||||||
|
{
|
||||||
|
hash_combine(seed, val);
|
||||||
|
hash_val(seed, args ...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename ... Types>
|
||||||
|
inline std::size_t hash_val( const Types&... args)
|
||||||
|
{
|
||||||
|
std::size_t seed = 0;
|
||||||
|
hash_val(seed, args...);
|
||||||
|
return seed;
|
||||||
|
}
|
||||||
|
|
||||||
namespace std
|
namespace std
|
||||||
{
|
{
|
||||||
template <> struct hash<std::pair<NodeID, NodeID>>
|
template <> struct hash<std::pair<NodeID, NodeID>>
|
||||||
{
|
{
|
||||||
size_t operator()(const std::pair<NodeID, NodeID> &pair) const
|
size_t operator()(const std::pair<NodeID, NodeID> &pair) const
|
||||||
{
|
{
|
||||||
return std::hash<int>()(pair.first) ^ std::hash<int>()(pair.second);
|
return hash_val(pair.first, pair.second);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user