c++ - 使用 std::unordered_map 的散列函数有什么限制

标签 c++ c++11 hash unordered-map

我正在使用 std::unordered_map 来表示 3 维空间排列中的数据。我的哈希函数是:

unsigned int x,y,z;
unsigned int a =1000;
unsigned int b = 1000*a;
unsigned int Hash = x + a*y + b*z;

在发生任何碰撞之前,应该允许最多 1000 个单位的 x,1000 个单位的 y。 我的问题是,我的哈希函数的无碰撞空间是否有任何限制?或者我可以将 a 和 b 设置为较大的数字,注意如果全部分配,这很容易超过我的系统内存?

干杯

最佳答案

首先,哈希表操作的一些背景:

哈希表没有分配足够的桶来容纳哈希函数的整个空间。那确实是浪费(而且可能也是不可能的)。他们分配一定数量的桶(比如 16 个),然后将每一对存储在桶中, key 散列为模桶的数量。

本地图达到一定阈值(通常为 75-85%)占用的桶时,桶的数量会增加。这会强制重新散列所有 key ,以便将它们应用于新的模数。

因此,如果您的哈希函数针对特定键返回 50,并且哈希表有 16 个桶,则该键的对存储在桶 (50 mod 16) = 2 中。

如果桶的数量后来增加到 32,则该对将移动到桶 (50 mod 32) = 18。

can I set a and b to be large numbers

当然可以,因为哈希对分配的桶数取模用于查找特定键的桶。

关于c++ - 使用 std::unordered_map 的散列函数有什么限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46231326/

相关文章:

arrays - 如何从 ruby​​ 中的哈希数组的范围中找到最小值?

c++ - 如何在处理负数的 C/C++/Obj-C 中编写模 (%) 运算符

c++ - 这个线程池/多核模拟有什么问题

ios - Unity3d 编辑器和 iPhone6 设备上的 Sha1 hash 不同

c++ - 使用 vector 类实现堆栈的链表与动态数组

c++ - 如何确定 C++ 中实例化容器模板的容器模板类型

c++ - 使用 SWIG 和外部 C 库构建问题

c++ - 这段C++代码有什么问题?

c++ - 使用模板对单个 c++ 对象和 std::pair 对象进行抽象

ruby - 摘要的 Base-36 表示