Почему "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.

Бен прав, отражает сборку, которую вы видите, это просто простое число, которое они выбрали для использования.

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