Почему "397" используется для переопределения GetHashCode ReSharper?

Как и многие из вас, я использую ReSharper для ускорения процесса разработки. Когда вы используете его для переопределения членов класса равенства, код-gen, который он создает для 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?

  • EDIT: Итак, мой вопрос будет лучше сформулирован так: есть ли что-то особенное в том, что простое число 397 вне его является простым числом?

Ответ 1

Вероятно, потому что 397 - это простое количество достаточного размера, чтобы вызвать переполнение результирующей переменной и несколько смешать биты хэша, обеспечивая лучшее распределение хэш-кодов. Нет ничего особенного в 397, который отличает его от других простых чисел одинаковой величины.

Ответ 2

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

Ответ 3

Хэш, который использует resharper, выглядит как вариант FNV хэш. FNV часто реализуется с разными штрихами. Там обсуждается соответствующий выбор простых чисел для FNV здесь.