Чому '397' використовується для переосмислення ReSharper GetHashCode?


150

Як і багато хто з вас, я використовую 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?

  • EDIT: Отже, моє запитання було б краще сформульовано як: чи є щось «особливе» у тому, щоб 397 простих номерів поза ним було простим числом?

Відповіді:


166

Можливо, тому, що 397 є простим розміром, який може призвести до переповнення змінної результатів і змішування бітів хешу, забезпечуючи кращий розподіл хеш-кодів. Нічого особливого в 397 немає, що не відрізняє його від інших праймерів такої ж величини.


73
І 397 щасливий. Не всі ми просто хочемо бути щасливими?
Рассел Б

2
Гаразд, але чому він повинен бути головним, і чому він повинен бути саме такої величини? Якщо він повинен бути простим, чому б не 2 чи 2147483647? Я думаю, щоб отримати гарну мутацію (і єдиною причиною цього множення є мутація) нам не потрібно число, щоб бути простим. Нам потрібен мультиплікатор, щоб мати відносно однакове число або нулі та одиниці, бажано без явних шаблонів. 397 = 110001101b відповідає. Досі не впевнений у масштабі.
Андрій К

5
Як сказав Нік, в цьому немає нічого особливого. Це НЕ БУДЕ бути такого розміру, це лише число, яке досить велике, що при обчисленні хеша результат переповниться (оскільки GetHashCode () повертає Int32). Вибір простих просто корисний для розповсюдження, у мене немає ступеня математики, тому я не збираюся його пробувати і пояснювати, але множення на простих матиме результат, який краще розподіляється, ніж множення на будь-яке інше довільне число.
Бен Рендалл

16

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.