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