【问题标题】:What would be implementation GetHashCode() for IEqualityComparer<double>IEqualityComparer<double> 的实现 GetHashCode() 是什么
【发布时间】:2014-11-08 20:42:24
【问题描述】:

我正在为以下课程寻找GetHashCode() 方法的简单实现。

public class EpsilonEqualityComparer : IEqualityComparer<double>
{
    private readonly double _epsilon;
    public EpsilonEqualityComparer(double epsilon)
    {
        _epsilon = epsilon;
    }

    public bool Equals(double x, double y)
    {
        return Math.Abs(x - y) < _epsilon;
    }

    public int GetHashCode(double obj)
    {
        ...
    }
}

当然,简单的实现类似于return Math.Sign(obj)。不过,我正在寻找更实用的东西。你有什么想法吗?

【问题讨论】:

  • 这可能并不容易。 GetHashCode() 应该与 Equals() 保持一致。如果您的 Equals() 与 epsilon 进行比较,那么与 epsilon 比较相等的两个双精度必须具有相同的哈希码。

标签: c# .net hashcode


【解决方案1】:

这甚至在您不必担心GetHashCode 之前就破坏了IEqualityComparer&lt;&gt; 的规范。

对于相等性检查,您需要 x == y &amp;&amp; y == z 来暗示 x == z,但对于您的 Equals 实现而言,情况并非如此。例如,对于 1 的 epsilon,您有 1 == 1.91.9 == 2.8,但没有 1 == 2.8

(您还需要 x == xx == y 来暗示 y == x,但您的相等性检查可以满足这些要求。)

【讨论】:

    【解决方案2】:

    恐怕我对此的回答会与此类似:How to implement GetHashCode for this situation?

    但是,在您的情况下,情况并不那么明显。看起来你有一个正确定义的相等条件,但它可能不是。

    在另一个答案中,我提到了 MSDN 声明:

    (x.Equals(y) && y.Equals(z)) 当且仅当 x.Equals(z) 返回 true 时才返回 true。

    现在,假设您有三个数字:

    x = anything
    y = x + epsilon
    z = y + epsilon // == x + 2 * epsilon
    

    那么x.Equals(y)y.Equals(z)x 不等于z

    因此,您最终不会得到正确定义的不同相等集,并且您不能为这些集分配任何哈希码编号。

    【讨论】:

    • 很遗憾我不能接受两个答案。无论如何,谢谢你们。
    猜你喜欢
    • 2012-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-23
    • 2010-10-05
    • 2014-11-04
    • 2011-08-20
    • 1970-01-01
    相关资源
    最近更新 更多