比C ++ unordered_set好的哈希函数

时间:2016-02-29 04:46:50

标签: c++ hash

我希望在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,但使用有序集只是因为它更容易哈希似乎......错了。

2 个答案:

答案 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

,其中

  • f是单个元素的好散列函数(在您的情况下为整数)
  • op是一个可交换的运算符,例如xor或plus

哈希一个整数最初可能无意义,但你的目标是使两个相邻的整数彼此不相似,这样当与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);
};