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

StackOverflow https://stackoverflow.com/questions/102742

Вопрос

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

Решение

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

Другие советы

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

Хэш, который использует resharper, выглядит как вариант ФНВ хеш.FNV часто реализуется с разными простыми числами.Идет дискуссия о правильном выборе простых чисел для FNV. здесь.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top