“散列函数的分布”是什么意思?

时间:2012-04-06 06:08:55

标签: c# .net hash

在阅读MSDN for Object.GetHashCode方法的文档时,我遇到了哈希函数应该在哈希表中提供随机或有用分布的短语。对于散列函数或散列表,这种分布意味着什么?

2 个答案:

答案 0 :(得分:13)

哈希函数产生32位整数,以“平衡”哈希表。假设您的表有一百个“桶”,并且您根据哈希函数的底部两位小数将表中的项放入桶中。

现在假设散列函数总是产生偶数为百的几倍的数字。每个项目都将进入相同的存储桶,并且哈希表将是不平衡的。这将是一个糟糕的哈希函数。

无论您如何从哈希中提取桶号,无论您拥有多少桶和,良好的哈希算法都会产生大致均匀的分布

答案 1 :(得分:2)

对于以最大功效运行的哈希表,哈希值应尽可能唯一,以防止冲突。例如,让我们考虑一个非常天真的哈希函数:假设您的对象是名字和姓氏,而对于您的哈希值,您可以选择首字母。所以Ginger Rodgers的哈希值是GR,Fred Astaire的哈希值是FA。到目前为止一切都那么好,但是当弗兰克艾伦带着FA的散列值时会发生什么?现在你在Fred Astaire和Frank Allen之间发生了冲突,哈希表的实现必须将其作为特殊情况来处理,这会降低效率。

最好的散列函数占用输入空间(Fred Astaire),并产生一个随机值(理想情况下)对输入空间是唯一的。只要哈希的大小小于数据大小,就无法完全避免冲突,但应该通过仔细选择哈希算法来最小化它们。

正如下面Eric所指出的,用于平衡哈希表的哈希算法必须非常快,所以你必须在速度和冲突之间取得平衡。您可以研究像SHA-1(http://en.wikipedia.org/wiki/SHA-1)这样的加密哈希算法来理解生成唯一哈希值的复杂性,但是用于平衡哈希表的哈希算法需要尽可能快