Что такое хорошее значение для нулевой безопасной функции хэш-кода, возвращаемой, когда аргумент равен нулю?

Итак, у меня есть объект с большим количеством свойств, и мне нужно сравнить их, поэтому я должен перезаписать 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 как Foo) == NULL и (NULL как Bar) == NULL оценивается как true, поэтому возвращение одинакового хэш-кода для нулевых объектов разнородных типов должно быть разумным. Я понимаю, что там, где используются хеш-коды, если два хеш-кода одинаковы, тогда.Equals используется для проверки, действительно ли они равны, поэтому коллизии не проблема. Я просто не знаю, что будет хорошим, значимым синтаксическим значением для нуля.

TL; DR?

Посмотрите на второй блок кода. Что такое хорошее возвращаемое значение, когда вы пытаетесь определить HashCode для нуля?

1 ответ

Решение

Поскольку по битам или с 0 исходное значение остается неизменным, я бы рекомендовал возвращать 0. Это сделает нулевые значения в основном неработоспособными.

Другие вопросы по тегам