说我决定我的一系列整数的hash_set的哈希是整数本身。并且还说我的整数范围非常大,1-20然后是1000-1200,然后是10000-12000。 例如:1,2,5,7,1111,1102,1000,10003,10005 这不是一个非常糟糕的哈希函数吗?在这种情况下,如果有人知道,那么如何通过hash_set存储数据,例如gcc实现。
编辑: 谢谢你的回复。我应该注意,我已经指定了我的hasher来返回输入值。例如1001的哈希值是1001.所以我问实现是否可以自由地进行另一轮哈希,或者它会看到1001并且数组大小会增长到1001吗?
答案 0 :(得分:0)
哈希表从小开始,偶尔会在负载因子变得足够高时重新增长。仅仅因为哈希值是12000并不意味着会有12000个桶,当然 - hash_set会做类似" mod"哈希函数的输出使其适合桶的数量。
您描述的身份函数对于许多哈希表实现(包括GCC' s)来说并不是一个糟糕的哈希函数。事实上,它是许多人使用的,显然它是有效的。它是一个不好的例子是加密哈希函数,但它有不同的目的。
答案 1 :(得分:0)
即使您的数据在散列值中的某些范围内聚集,通常也只会使用每个值的散列的最低有效位来存储它。这意味着如果表示0-128的位均匀分布,那么无论散列值的分布如何,您的散列函数仍然表现良好。但这确实意味着如果您的值都是某个二进制值的倍数,例如8然后低位将不会如此均匀地分布,并且值将在哈希表中聚集,从而导致过度链接和减慢操作。