在C ++语言中,对于最简单的类型,有默认的哈希函数模板std::hash<T>
,例如std::string
,int
等。我想,这些函数有一个很好的熵和相应的随机变量分布在统计上是一致的。如果不是,那就让我们假装它是。
然后,我有一个结构:
struct CustomType {
int field1;
short field2;
string field3;
// ...
};
我想使用其中某些字段的单独哈希值来哈希,例如std::hash(field1)
和std::hash(field2)
。两个哈希都在size_t
类型的一组可能值中。
什么是好的哈希函数,可以将这些结果合并并将它们映射回size_t
?
答案 0 :(得分:5)
boost::hash_combine
非常适合散列不同的字段。
如果你没有升级库,你可以使用它:
template <class T>
inline void hash_combine(std::size_t & s, const T & v)
{
std::hash<T> h;
s^= h(v) + 0x9e3779b9 + (s<< 6) + (s>> 2);
}
struct S {
int field1;
short field2;
std::string field3;
// ...
};
template <class T>
class MyHash;
template<>
struct MyHash<S>
{
std::size_t operator()(S const& s) const
{
std::size_t res = 0;
hash_combine(res,s.field1);
hash_combine(res,s.field2);
hash_combine(res,s.field3);
return res;
}
};
然后可能std::unordered_set<S> s;
等等
答案 1 :(得分:3)
boost::hash_combine
可以帮到你:
namespace std
{
template <>
struct hash<CustomType>
{
std::size_t operator()(const CustomType& c) const
{
std::size_t result = 0;
boost::hash_combine(result, field1);
boost::hash_combine(result, field2);
return result;
}
};
}
请参阅提升文档here。