当参数为null时,返回null安全哈希码函数的好值是什么?

时间:2016-04-22 05:22:38

标签: c# null hashcode

所以我有一个包含大量属性的对象,我需要比较它们,我必须覆盖GetHashCode。这很令人头疼,因为任何属性都可以为null,所以我有几条重复的行

int hashcode = 0;
if (!String.IsNullOrEmpty(Property1)) hashcode ^= Property1.GetHashCode();
if (!String.IsNullOrEmpty(Property2)) hashcode ^= Property2.GetHashCode();
if (!String.IsNullOrEmpty(Property3)) hashcode ^= Property3.GetHashCode();
if (!String.IsNullOrEmpty(Property4)) hashcode ^= Property4.GetHashCode();
....
....
return hashcode * 11; // Use prime multiplication to help evenly distribute hashes

重复" IsNullOrEmpty"由于某种原因让我无理的愤怒,我在我的代码中不喜欢它。更重要的是,大多数情况下,并非所有属性都是字符串,因此其中一些只是" if(obj == null)"它甚至没有排成一行。我对这个解决方案印象不深。为了纠正这个问题,我试图提出一个扩展功能,它看起来像这样

public static int NullSafeHashCode<T>(this T Hashable)
{
    if(Hashable == null) {return **I have no idea what to put here**;}
    else return Hashable.GetHashCode();
}

我知道只需要确定性地创建哈希码(ergo,不基于时间戳),使得相等的值具有相等的哈希码。我非常确定(null为Foo)== null和(null为Bar)== null计算结果为true,因此在不同类型的null对象上返回相同的哈希码应该是合理的。我知道在使用哈希码的情况下,如果两个哈希码相同,那么.Equals用于验证它们实际上是否相等,因此冲突不是问题。我只是不知道什么是一个好的,有意义的句法值为null。

TL; DR吗

查看第二个代码块。当您尝试将HashCode定义为null时,什么是良好的返回值?

1 个答案:

答案 0 :(得分:3)

由于按位或0保持原始值不变,我建议返回0.这将使空值基本上成为无操作。