c# – Nullable.GetHashCode()是一个糟糕的哈希码函数吗?

前端之家收集整理的这篇文章主要介绍了c# – Nullable.GetHashCode()是一个糟糕的哈希码函数吗?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
Nullable< T> .GetHashCode()的实现如下:
public override int GetHashCode()
{
    if (!this.HasValue)
    {
        return 0;
    }
    return this.value.GetHashCode();
}

但是,如果基础值也生成哈希码0(例如,bool设置为false或int32设置为0),那么我们有两个通常出现的具有相同哈希码的不同对象状态.在我看来,更好的实现将是类似的.

public override int GetHashCode()
{
    if (!this.HasValue)
    {
        return 0xD523648A; // E.g. some arbitrary 32 bit int with a good mix of set and 
                           // unset bits (also probably a prime number).
    }
    return this.value.GetHashCode();
}

解决方法

是的,你有一个观点.如果您事先知道要存储的数据,则始终可以编写更好的GetHashCode()实现.并不是图书馆作家所拥有的奢侈品.但是,是的,如果你有很多布尔?无论是假的还是!HasValue然后默认的实现会受到伤害.枚举和整数相同,零是一个常见值.

然而,你的论点是学术性的,改变实施成本减去一万分,你不能自己做.你能做的最好的就是提交建议,正确的渠道是user-voice site.掌握这一点将是困难的,祝你好运.

猜你在找的C#相关文章