std :: unordered_map对哈希函数的限制是什么?
What are the limitations for hash functions with std::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设置为大数字,并指出如果全部分配了我的系统的内存?
欢呼
首先,有关Hashtables操作的一些背景:
Hashtables不能分配足够的存储桶来保留哈希函数的整个空间。那确实是浪费的(也可能是不可能的)。他们分配了一定数量的存储桶(例如16),然后将每个对键放入键hashes的存储桶中。
当地图达到一定的阈值(通常为75-85%)被占用的水桶时,存储桶的数量会增加。这会迫使所有键重新进行,以便将它们应用于新的模特。
因此,如果您的哈希功能返回特定键的50,并且Hashtable具有16个存储桶,则该键的对存储在存储桶中(50 mod 16)= 2。
。如果稍后将存储桶数增加到32,则将将两人移至水桶(50 mod 32)= 18。
我可以将A和B设置为大数字
绝对,因为Hash Modulo使用分配的存储桶的数量来找到特定键的存储桶。
相关文章:
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 是什么原因导致它无法编译?它是声明签名还是在函数本身的实现中
- 是什么让放置新调用对象的构造函数?
- 重载运算符的范围是什么?它是否会影响作为类成员的集合的插入函数?
- 在函数中拥有函数原型的目的是什么?
- 使用基类指针调用基类的值构造函数的语法是什么?
- C++:使用方法调用析构函数的顺序是什么?
- 将此布尔值传递给此函数的最有效方法是什么?
- * 和 ** 在 C++ 函数声明中是什么意思?
- C++:Lambda 函数指针转换的用例是什么?
- C++关于指针和使用函数将它们启动到堆的行为究竟是什么?
- 这个C++编译器优化(在自身的实例上调用对象自己的构造函数)的名称是什么,它是如何工作的?
- 在将函数声明为友元时,尖括号的含义是什么?
- 在模板类之外定义友元函数的正确方法是什么?
- 在使用包含冒号的类似函数的宏时,是什么导致了这种编译器差异?
- 具有相同特征的两个对象是否只在内存中存储一次?无论定义它们的函数是什么,都是不同的
- 这里的字符串函数是什么意思
- 传递 lambda 函数的权衡是什么?
- 在C 中,对2D数组的增量是什么?函数断言(0)做什么?