【问题标题】:c++ hash function for an int array用于 int 数组的 c++ 哈希函数
【发布时间】:2011-11-01 04:39:50
【问题描述】:

我需要专门化 unordered_map 的散列函数,以便可以使用 int 数组作为键。数组值通常为 0 或 1,例如int array = {0, 1, 0, 1},但技术上没有限制。

在这种情况下,有人可以推荐一个好的哈希函数吗?或者,我总是可以将 int 数组转换为字符串并避免专门化。但我担心性能,因为我可能有几百万个这样的数组。

【问题讨论】:

  • 使用或模仿 Boost 的“范围哈希”。它是通过反复调用hash_combine 建立起来的,它也在 Boost 中,应该确实在标准中。
  • 如果您确实有几百万个这样的数组,我建议您使用新的算法/数据结构...
  • @Blindy 你会建议什么数据结构?
  • @Kerreck,boost.org/doc/libs/1_35_0/doc/html/boost/… 说它不适合无序容器。这不适用于我的情况吗?
  • @gewizz:这是草率的措辞。获取无序容器作为一个整体的确定性哈希是不合适的[排序可能取决于负载因子和完成的重新分配次数]。但是,当然适合用作无序容器的元素哈希函数

标签: c++ hash


【解决方案1】:

C++ TR1 包含一个哈希模板函数。

如果还没有,可以使用 Boost Hash。

一个方便的助手的想法:

#include <boost/functional/hash.hpp>

template <typename T, int N>
    static std::size_t hasharray(const T (&arr)[N])
{
     return boost::hash_range(arr, arr+N);
}

这将(大致?)等价于

 size_t seed = 0;
 for (const T* it=arr; it!=(arr+N); ++it)
     boost::hash_combine(seed, *it);
 return seed;

如果您使用此哈希进行查找,请不要忘记实现正确的相等比较操作

【讨论】:

  • 我认为应该是std::size_t N,因为std::size_t保证能够表示最大可能数组的大小,而int可能会溢出(取决于系统)。另外,它不需要是签名类型。
  • @outofthecave 公平点。然而,unsigned 具有传染性,这使得偏移量难以处理(它们可能是负数,N - 10 将在N&lt;10 时环绕。惊喜!)。此外,静态类型大于 2³¹ 元素的数组?那些是罕见的。如果你有它们,你就不会经常散列它们。
【解决方案2】:

尝试使用lookup8 哈希函数。这个功能非常快而且很好。

int key[100];
int key_size=10;
for (int i=0;i<key_size;i++) key[i]=i; //fill key with sample data
ub8 hash=hash((ub8*)key, sizeof(key[0])*key_size, 0);

UPD:或者使用更好的功能。 - t1ha

【讨论】:

  • 通常哈希函数是用纯 c 编写的。您可以为其创建 C++ 包装器。
  • 通常,散列函数用现有的语言编写
  • 您总是编写 crc32、sha、md5 之类的函数,还是使用现有的经过良好测试的高性能实现? :)
  • 函数太复杂,编译时无法使用
猜你喜欢
  • 1970-01-01
  • 2012-01-23
  • 2013-07-29
  • 1970-01-01
  • 2011-11-05
  • 1970-01-01
  • 1970-01-01
  • 2015-06-22
  • 1970-01-01
相关资源
最近更新 更多