我希望在C ++ std::unordered_set<char>
上实现哈希函数。我最初尝试使用boost :: hash_range:
namespace std
{
template<> struct hash<unordered_set<char> >
size_t operator(const unordered_set<char> &s)(
{
return boost::hash_range(begin(s), end(s))
};
}
然后我意识到因为集合是无序的,迭代顺序不稳定,因此散列函数是错误的。对我来说有什么更好的选择?我想我可以std::set
代替std::unordered_set
,但使用有序集只是因为它更容易哈希似乎......错了。
答案 0 :(得分:3)
一个非常类似的问题,虽然在C#中,但在这里被问到:
Hash function on list independant of order of items in it
在那里,Per提供了一个很好的语言独立答案,可以让你走上正确的轨道。简而言之,对于输入
x 1 ,...,x n
你应该把它映射到
f(x 1 )op ... op f(x n )
,其中
哈希一个整数最初可能无意义,但你的目标是使两个相邻的整数彼此不相似,这样当与op结合时不会产生相同的结果。例如如果你使用+作为运算符,你希望f(1)+ f(2)给出与f(0)+ f(3)不同的结果。
如果标准的散列函数不适合f并且找不到,请查看链接的答案以获取更多详细信息......
答案 1 :(得分:2)
您可以尝试简单地添加与订单无关的内容并返回其中的哈希值:
template<> struct hash<unordered_set<char> >
size_t operator(const unordered_set<char> &s) {
long long sum{0};
for ( auto e : s )
sum += s;
return std::hash(sum);
};