如果我有一个从1到100的键值列表,并且想将它们组织成11个存储桶的数组,那么我会被教导如何形成mod函数
现在,所有值将在9行中一个接一个地放置。例如,在第一个存储桶中将有。在第二个中,将有等。
假设我决定成为一个坏孩子,并使用非质数作为我的哈希函数-以12为例。使用哈希函数
会导致哈希表的值在第一个存储桶中为0、12、24 ,在第二个存储桶中为1、13、25 等,依此类推。
本质上,它们是同一件事。我没有减少冲突,也没有通过使用质数哈希码更好地进行扩展,而且我看不出它有什么好处。
如果我有一个从1到100的键值列表,并且想将它们组织成11个存储桶的数组,那么我会被教导如何形成mod函数
现在,所有值将在9行中一个接一个地放置。例如,在第一个存储桶中将有。在第二个中,将有等。
假设我决定成为一个坏孩子,并使用非质数作为我的哈希函数-以12为例。使用哈希函数
会导致哈希表的值在第一个存储桶中为0、12、24 ,在第二个存储桶中为1、13、25 等,依此类推。
本质上,它们是同一件事。我没有减少冲突,也没有通过使用质数哈希码更好地进行扩展,而且我看不出它有什么好处。
Answers:
考虑一组键和一个哈希表,其中存储桶数为。由于是一个因子,是的倍数的键将被散列到属于的倍数桶:
如果是均匀分布的(即,每个键都同样可能出现),则的选择不是那么关键。但是,如果不均匀分布会怎样?想象一下,最可能出现的密钥是的倍数。在这种情况下,所有不是倍数的存储桶都将很可能为空(这在哈希表性能方面确实很糟糕)。
这种情况看起来更常见。例如,想象一下,您正在根据对象在内存中的存储位置来跟踪它们。如果计算机的字大小为4个字节,则您将使用倍数作为哈希键。不用说,将选为的倍数将是一个糟糕的选择:您将有存储桶完全为空,并且所有键都在其余的存储桶中碰撞。
一般来说:
中与存储桶数共有一个公因数的每个密钥都将散列到该存储桶数倍的存储桶中。
因此,为了使冲突最小化,重要的是减少和元素之间的公因数。如何做到这一点?通过选择为具有很少因素的数:质数。
使用质数是否不太可能发生碰撞取决于密钥的分布。
如果您的许多键的形式为并且您的哈希函数为,则这些键将进入存储桶的一小部分,如果除以。因此,您应该最小化此类的数量,这可以通过选择质数来实现。
另一方面,如果您希望拥有到存储桶,并且知道倍数的差异比和倍数的差异更有可能,则可以为非常特殊的应用选择。