c# - 为什么 ORing 两个整数被认为是一个好的哈希函数?

标签 c# algorithm data-structures hash bit-manipulation

我的一本 C# 书籍(C# 3.0 Cookbook by Hillyard and Teilhet)给出了一个 Square 类的例子,写了 GetHashCode 作为

public override int GetHashCode ( ) 
{
    return this.Height.GetHashCode() | this.Width.GetHashCode();
}

我想知道为什么这被认为是一个好的哈希码。因为 | 操作的表是

x | y | x OR y
--------------
0 | 0 |   0
1 | 0 |   1 
0 | 1 |   1
1 | 1 |   1

这意味着有 3/4 的时间运算结果是 1。所以如果你有杂项 ints w, x, y, z 这意味着 w | x == y | z 并没有尽可能小(例如,如果使用了 ^)。

我的理解是否正确?或者是否有充分的理由将 | 用于哈希函数?

最佳答案

那是一个可怕的、可怕的散列函数,正是因为你提到的原因。肯定是一个错误(或者你应该找一本新书!)。您应该将其提交到本书的勘误表页面:

http://www.oreilly.com/catalog/errata.csp?isbn=9780596516109

关于c# - 为什么 ORing 两个整数被认为是一个好的哈希函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35967215/

相关文章:

c# - 分配新实例后 INotifyPropertyChanged 不起作用

algorithm - 什么是计算机科学中的 NP-complete?

algorithm - 重新排序列表的元素,以便连续的元素彼此成功?

c++ - 为什么我不能在此链接列表中打印第一个元素?

c# - winforms 中的数据转发器控件

c# - Autofac:如何在不绕过 IoC 容器的情况下限制 IDisposable 对象的生命周期

c# - OWIN 启动不工作

algorithm - 人工智能方法检测游戏中的作弊行为

algorithm - 我如何在两个数字之间来回收敛?

algorithm - 使用动态规划的最低成本