Зачем использовать простое число 31?
Это можно разделить на две части?
- Почему простое число?
Здесь нам нужно понять, что наша цель — получить уникальный HashCode для объекта, который поможет нам найти этот объект за время O(1).
Ключевое слово здесь — уникальный.
Простые числа
Простые числа — это уникальные числа. Они уникальны тем, что произведение простого числа на любое другое число имеет наилучшие шансы быть уникальным (конечно, не таким уникальным, как само простое число) из-за того, что для его составления используется простое число. Это свойство используется в функциях хеширования.
.
Почему номер 31?
Из Эффективная Java
из пункта 9: Всегда переопределяйте hashCode при переопределении equals:
Значение 31 было выбрано потому, что это нечетное простое число. Если бы оно было четным, а умножение переполнилось бы, информация была бы потеряна, так как умножение на 2 эквивалентно сдвигу. Преимущество использования прайма менее очевидно, но оно традиционно.
Замечательным свойством числа 31 является то, что умножение можно заменить сдвигом (§15.19) и вычитанием для повышения производительности:
31 * i == (i ‹‹ 5) - i Современные виртуальные машины выполняют такую оптимизацию автоматически.
Хотя рецепт в этом пункте дает достаточно хорошие хеш-функции, он не дает современных хеш-функций, и библиотеки платформы Java не предоставляют такие хэш-функции по состоянию на выпуск 1.6. Написание таких хэш-функций — тема исследований, которую лучше оставить математикам и теоретикам-компьютерщикам.
Возможно, более поздняя версия платформы предоставит современные хеш-функции для своих классов и служебных методов, чтобы обычные программисты могли создавать такие хеш-функции. Между тем, методы, описанные в этом пункте, должны подойти для большинства приложений.
Это очень хороший источник.< /а>
person
JNL
schedule
13.09.2013