gpt4 book ai didi

c++ - 如何正确散列自定义结构?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:24:28 25 4
gpt4 key购买 nike

在 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

最佳答案

boost::hash_combine非常适合散列不同的字段。

如果你没有 boost 库,你可以使用这个:

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;

关于c++ - 如何正确散列自定义结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19195183/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com