哈希表:为什么大小应该是素数?

时间:2010-10-20 16:27:09

标签: data-structures

  

可能重复:
  Why should hash functions use a prime number modulus?

为什么哈希表(数据结构)大小必须是素数?

据我了解,它确保了更均匀的分布,但还有其他原因吗?

2 个答案:

答案 0 :(得分:28)

唯一的原因是避免将值聚集到少量桶中(是的,分发)。更均匀的分布式哈希表将更加一致地执行。

来自http://srinvis.blogspot.com/2006/07/hash-table-lengths-and-prime-numbers.html

  

如果假设你的hashCode函数导致以下hashCodes {x,2x,3x,4x,5x,6x ...},那么所有这些都将集中在m个桶中,其中m = table_length / GreatestCommonFactor(table_length,x)。 (验证/得出这个是微不足道的)。现在,您可以执行以下操作之一以避免群集

     
      
  1. 确保您不会生成太多的hashCode,这些hashCode是{x,2x,3x,4x,5x,6x ...}中的另一个hashCode的倍数。但如果这可能有点困难,如果你的hashTable应该有数百万条目。

  2.   
  3. 或者通过使GreatestCommonFactor(table_length,x)等于1来简单地使m等于table_length,即通过使table_length与x进行互操作。如果x可以是任何数字,那么请确保table_length是素数。

  4.   

答案 1 :(得分:-5)

无论你使用什么哈希函数,你都会得到一个整数。为了将其映射到散列表,通常你会mod具有散列表大小的整数,以使该值小于表的大小,以便映射它。

返回hashVal%tableSize

从这一点开始我有点失落,但是如果tableSize是偶数,那么IIRC,所有条目都是偶数。哈希表的一半永远不会被填充。