我使用std :: unordered_map来表示3D维空间排列中的数据。我的散列函数是:
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设置为大数字,并指出如果全部分配,这很容易超过我的系统内存?
欢呼答案 0 :(得分:1)
首先,关于哈希表操作的一些背景知识:
哈希表没有分配足够的桶来保存哈希函数的整个空间。这确实是浪费(也可能是不可能的)。它们分配了一定数量的桶(比如说16个),然后将每个桶存储在桶中,密钥散列到模数桶的数量。
当地图达到占用桶的特定阈值(通常为75-85%)时,桶的数量会增加。这会强制重新调整所有键,以便将它们应用于新的模数。
因此,如果您的哈希函数为特定键返回50,并且哈希表有16个桶,则该键的对存储在桶中(50 mod 16)= 2.
如果桶的数量后来增加到32,则该对将被移动到桶(50 mod 32)= 18。
我可以将a和b设置为大数
当然,因为用于查找特定键的存储桶的哈希模数已分配的存储桶的数量。