关于哈希表的容量,该怎么处理

关于哈希表的容量
在一个程序里的哈希表实现中,哈希表的大小取决于一组质数:

const   int   primes[]   =  
    {
        13,   19,   29,   41,   59,   79,   107,   149,   197,   263,   347,   457,   599,   787,   1031,
        1361,   1777,   2333,   3037,   3967,   5167,   6719,   8737,   11369,   14783,
        19219,   24989,   32491,   42257,   54941,   71429,   92861,   120721,   156941,
        204047,   265271,   344857,   448321,   582821,   757693,   985003,   1280519,
        1664681,   2164111,   2813353,   3657361,   4754591,   6180989,   8035301,
        10445899,   13579681,   17653589,   22949669,   29834603,   38784989,
        50420551,   65546729,   85210757,   110774011,   144006217,   187208107,
        243370577,   316381771,   411296309,   534685237,   695090819,   903618083,
        1174703521,   1527114613,   1837299131,   2147483647
    };

哈希表每增一次容量,都是取该质数表中最相近的质数.
我的疑问是,为什么要根据这些质数取?这些质数是怎么算出来的?有什么科学依据?

------解决方案--------------------
应该是与HASH算法有关,做映射时,被映谢空间大小是质数。

------解决方案--------------------
哈希表的大小取决于一组质数,原因是在hash函数中,你要用这些质数来做模运算(%).
而分析发现,如果不是用质数来做模运算的话,很多生活中的数据分布,会集中在某些点上.
所以这里最后采用了质数做模的除数.

因为用质数做了模的除数,自然存储空间的大小也用质数了.因为模完之后,数据是在[0-所选质数)之间.
------解决方案--------------------
对于采用模除法的hash表构造,桶大小取质数,或者桶不被10以下的质数整除,可以保证hash表冲突最小。
------解决方案--------------------
我想可能是考虑数据的增量吧,数据量越大,每次增加的数据可能就越多,所以开始是13,19(每次增加5),后面慢慢变成一次增加10几,20几。

这种特性和vector的自动增加容量的方式也是一样的。
------解决方案--------------------
选这些是应该是效率问题把,避免计算或选择全部质数。间隔多少是个人喜好。

至于数学原理,刚刚翻了几本大学时候的书,上面写“经验得到”,估计是太深奥了~~

修正一下,D的大小应该是质数或者不被“20”以下质数整除的最合适。
------解决方案--------------------
哈息表大小为素数在理论上是有依据的,针对不同的哈希算法有不同的证明。例如,对于平方探测法,有如下定理:如果使用平方探测,且表大小是素数,那么当表至少有一半是空的时候,总能够插入一个新的元素。

证明时候需要用到素数这个性质,详细可以参看《数据结构与算法分析-C语言描述》