<p><a href="https://stackoverflow.com/a/27456720/908494">The Paramagnetic Croiss</a>回答了你的主要问题。数字11当然意味着,如果不重新分配表并重新刷新所有元素,就不能容纳超过11个元素,因此很明显,这并不是武断的。但这是任意的,只要这个数字是素数(是的,比你要做的插入数还要大),作者想要演示的所有内容都会得到相同的结果。*</p>
<p><sub>*尤其是,如果元素是自然数,并且表大小是素数,并且与最大整数相比足够小,<code>% size</code>是一个很好的哈希函数。</sub></p>
<p>但对于你的后续问题:</p>
<blockquote>
<p>It would seem though, that making a table with a bigger prime number would allow for you to have more available slots and require less need for you to rehash, and have less items to search through in each slot (if you extended the data slots to hold more than one value). The items would be spread thinner in general. Is this not correct?</p>
</blockquote>
<p>如果我对你的理解是对的,你用的词不对,这就是为什么你会得到令人困惑的答案。您的示例代码使用了一个名为<code>rehash</code>的函数,但这会误导您。重新散列是进行探测的一种方法,但这不是你的方法;你只是在做线性探测和双重散列的组合。*更常见的是,当人们谈论重新散列时,他们谈论的是你在扩展散列表之后要做什么,并且必须将旧表中的每个值重新哈希到新表中。在</p>
<p><sub>*当您的哈希函数像<code>key%size</code>一样简单时,区别是不明确的…</sub></p>
<p>总之,是的,更多的负载(如果M个bucket中有N个元素,那么就有N/M的负载)意味着更多的探测,这是不好的。以最极端的元素为例,在load1.0时,平均操作必须遍历表的一半以找到正确的bucket,这使得hash表的效率与暴力搜索数组一样低效。在</p>
<p>但是,随着负载的减少,返回值下降得很快。您可以为任何特定的散列实现绘制精确的曲线,但是您通常使用的经验法则(对于这样的封闭散列)是,使负载低于2/3通常是不值得的。请记住,一个更大的哈希表既有成本,也有好处。假设您在一台32位机器上,有一个64字节的缓存线。因此,11个指针适合一条缓存线;在任何哈希操作之后,下一个指针肯定是缓存命中。但是17个指针被分割在两条缓存线上;在任何哈希操作之后,下一个指针只有50%的机会被缓存命中。*</p>
<p><sub>*当然,实际上,在你的循环中有足够的空间来为一个哈希表使用2条缓存线;这就是为什么当N是个位数时,人们通常根本不担心性能……但是你可以看到,在更大的哈希表中,保留太多的空空间意味着更多的一级缓存未命中,更多的二级缓存未命中万一更多的虚拟机页面丢失。</sub></p>