Почему '397' используется для переопределения ReSharper GetHashCode? - PullRequest
138 голосов
/ 19 сентября 2008

Как и многие из вас, я использую 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 ]

150 голосов
/ 19 сентября 2008

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

17 голосов
/ 19 сентября 2008

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

11 голосов
/ 08 декабря 2015

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

...