0

假设我决定我的一系列整数的 hash_set 散列器是整数本身。还说我的整数范围非常大,1-20,然后是 1000-1200,然后是 10000-12000。eg: 1, 2, 5, 7, 1111, 1102, 1000, 10003, 10005 那不是很糟糕的散列函数吗?在这种情况下,hash_set 将如何存储数据,比如说 gcc 实现,如果有人知道的话。

谢谢

编辑:感谢您的两个答复。我应该注意我已经指定了我的哈希器来返回输入值。例如,1001 的哈希值将是 1001。所以我问实现是否可以自由地进行另一轮哈希,或者它会看到 1001 并且数组大小会增长到 1001?

4

2 回答 2

0

哈希表开始时很小,当负载因子足够高时,偶尔会重新散列以增长。仅仅因为散列值为 12000 并不意味着会有 12000 个桶,当然 - hash_set 会做类似“mod”散列函数的输出以使其适合桶的数量。

您描述的标识函数对于许多哈希表实现(包括 GCC)来说并不是一个糟糕的哈希函数。事实上它是很多人使用的,而且显然它是有效的。一个不好的例子是加密哈希函数,但它有不同的目的。

于 2012-04-24T07:37:08.867 回答
0

即使您的数据聚集在哈希值内的某些范围内,通常也只会使用每个值的哈希值的最低有效位来存储它。这意味着如果表示 0-128 的位均匀分布,那么无论散列值的分布如何,您的散列函数仍然会表现良好。但是,这确实意味着如果您的值都是某个二进制值的倍数,例如 8,那么低位将不会如此均匀地分布,并且这些值将聚集在哈希表中,从而导致过度链接并减慢操作速度。

于 2012-04-24T07:42:06.927 回答