gpt4 book ai didi

c++ - 在C++中,自定义数据类型的哈希应该返回什么?

转载 作者:行者123 更新时间:2023-12-03 07:06:54 24 4
gpt4 key购买 nike

我想在unordered_set中使用我的数据类型。它没有用,但是this SO question帮助理解了我需要做什么。
This answer然而让我困惑我到底应该在哈希结构中放什么。
现在我的哈希应该返回x.name.size()或更确切地说是x.hash吗?
我的数据类型:

struct State {
std::string name;
std::size_t hash = std::hash<std::string>{}(name);

bool operator==(const State &rhs) const;
bool operator!=(const State &rhs) const;
};
我应该使用A还是B?
namespace std {
template<>
struct hash<State>{

typedef State argument_type;
typedef std::size_t result_type;

size_t operator()(const foundation::State& x) const{
// A.) return x.name.size();
// B.) return x.hash;
}
};
}

最佳答案

哈希函数的主要功能是成为一个好的代理,无论两个对象可能相同还是绝对不同。
如果返回x.name.size(),则具有相同数量字母的State对象将具有相同的哈希码。如果将这些对象粘贴在unordered_set中,将导致大量碰撞。这意味着它将不得不依靠相对昂贵的比较来确定两个对象实际上是否相同。
如果您改为返回x.hash(应该是x.name的哈希值(希望永远不会更改)),则名称中的任何差异都将导致完全不同的哈希值。根据所使用的哈希函数,两个不同的对象发生碰撞的机会仅为2 in128的1分之一(在32位系统上为2 ^ 64的1分之一)。因此,您的unordered_set很可能能够均匀地分布结果,并使您更接近神奇的O(1)查找时间。

关于c++ - 在C++中,自定义数据类型的哈希应该返回什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64355857/

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