当参数为 null 时,return 的 null 安全哈希码函数的好值是多少?
What is a good value for a null safe hashcode function to return when the argument is null?
所以我得到了一个具有大量属性的对象,我需要比较它们,所以,我必须覆盖 GetHashCode。这很头疼,因为任何属性都可以为空,所以我有几行重复
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();
}
我知道哈希码只需要确定地创建(因此,不基于时间戳),这样相等的值就有相等的哈希码。我很确定 (null as Foo) == null 和 (null as Bar) == null 计算结果为 true,因此 return 在不同类型的 null 对象上使用相同的哈希码应该是合理的。我知道在使用哈希码的地方,如果两个哈希码相同,则 .Equals 用于验证它们实际上是否相等,因此冲突不是问题。我只是不知道 null 的一个好的、有意义的语法值是什么。
TL;博士?
看第二个代码块。当您尝试为 null 定义 HashCode 时,什么是好的 return 值?
由于按位或 0 保留原始值不变,我建议返回 0。这将使 null 值基本上成为空值。
所以我得到了一个具有大量属性的对象,我需要比较它们,所以,我必须覆盖 GetHashCode。这很头疼,因为任何属性都可以为空,所以我有几行重复
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();
}
我知道哈希码只需要确定地创建(因此,不基于时间戳),这样相等的值就有相等的哈希码。我很确定 (null as Foo) == null 和 (null as Bar) == null 计算结果为 true,因此 return 在不同类型的 null 对象上使用相同的哈希码应该是合理的。我知道在使用哈希码的地方,如果两个哈希码相同,则 .Equals 用于验证它们实际上是否相等,因此冲突不是问题。我只是不知道 null 的一个好的、有意义的语法值是什么。
TL;博士?
看第二个代码块。当您尝试为 null 定义 HashCode 时,什么是好的 return 值?
由于按位或 0 保留原始值不变,我建议返回 0。这将使 null 值基本上成为空值。