Почему "397" используется для переопределения ReSharper GetHashCode?
Как и многие из вас, я использую ReSharper для ускорения процесса разработки. Когда вы используете его для переопределения членов равенства класса, генерируемый код для GetHashCode() выглядит следующим образом:
public override int GetHashCode()
{
unchecked
{
int result = (Key != null ? Key.GetHashCode() : 0);
result = (result * 397) ^ (EditableProperty != null ? EditableProperty.GetHashCode() : 0);
result = (result * 397) ^ ObjectId;
return result;
}
}
Конечно, у меня есть некоторые из моих собственных членов, но я хочу знать, почему 397?
- РЕДАКТИРОВАТЬ: Таким образом, мой вопрос будет лучше сформулировать, есть ли что-то "особенное" в простом числе 397, кроме того, что оно является простым числом?
3 ответа
Возможно, потому что 397 - простое число достаточного размера, чтобы вызвать переполнение результирующей переменной и несколько смешать биты хеша, обеспечивая лучшее распределение хеш-кодов. В 397 нет ничего особенного, что отличает его от других простых чисел той же величины.
Хеш, который использует resharper, выглядит как вариант хеша FNV. FNV часто реализуется с разными простыми числами. Здесь обсуждается подходящий выбор простых чисел для FNV.
Бен прав, отражает сборку, которую вы видите, это просто простое число, которое они выбрали для использования.