Почему это должна быть собственность?Если бы это был метод GetChecksum (), то вам не пришлось бы иметь какую-либо специальную логику, чтобы он не включался в вычисление контрольной суммы.Теперь то, что вы создали, в значительной степени совпадает с тем, для чего предназначен существующий метод GetHashCode () - просто предоставьте реализацию этого вместо этого.
Как правило, можно было бы явно кодировать GetHashCode () для каждого класса, хотябыстрый поиск в сети покажет подходы, которые используют рефлексию, чтобы обеспечить общий (хотя и более медленный) механизм.Обычно нужно взять каждое поле, которое требуется включить в хеш-код, преобразовать его в целое число и умножить на фиксированное число, чтобы различные объекты с разными значениями для полей давали разные хеш-коды, которые хорошо разбросаны по целому диапазону.
Например, Resharper генерирует методы GetHashCode (), которые выглядят следующим образом:
public override int GetHashCode()
{
unchecked
{
int result = a;
result = (result * 397) ^ (b != null ? b.GetHashCode() : 0);
result = (result * 397) ^ c.GetHashCode();
return result;
}
}
Где a - это int, b - это строка, а c - это long.Промежуточное значение (результат) умножается на 397 и помещается в мощность хэш-кода следующего компонента на каждом шаге.Непроверенный означает, что если целое число переполнено (что вероятно), то мы отбрасываем переполнение и оборачиваемся.Это должно дать разумное покрытие целочисленного пространства в большинстве случаев - хотя я бы порекомендовал протестировать покрытие, так как плохой хэш-код может иметь серьезные последствия для производительности вашей системы.
Следует соблюдать осторожность при обработке нулейлюбое поле, чтобы вы не умножали на ноль и не получали большое количество объектов с нулевым хеш-кодом.