Я рекомендую использовать 92821 . Вот почему.
Чтобы дать содержательный ответ на этот вопрос, вы должны знать кое-что о возможных значениях i
и j
. В общем, единственное, о чем я могу думать, это то, что во многих случаях маленькие значения встречаются чаще, чем большие. (Вероятность того, что в вашей программе появится значение 15, намного выше, чем, скажем, 438281923.) Поэтому представляется хорошей идеей сделать как можно меньшую коллизию хеш-кода, выбрав подходящее простое число. Для 31 это довольно плохо - уже для i=-1
и j=31
у вас такое же хеш-значение, как для i=0
и j=0
.
Поскольку это интересно, я написал небольшую программу, которая искала во всем диапазоне int наилучшее простое число в этом смысле. То есть для каждого простого числа я искал минимальное значение Math.abs(i) + Math.abs(j)
по всем значениям i,j
, которые имеют тот же хеш-код, что и 0,0
, а затем взял простое число, где это минимальное значение максимально велико.
Drumroll : наилучшее простое число в этом смысле - 486187739 (с наименьшим столкновением i=-25486, j=67194
). Почти такой же хороший и намного легче запомнить - 92821 с наименьшим столкновением i=-46272 and j=46016
.
Если вы придаете «маленькому» другое значение и хотите, чтобы столкновение было как можно меньшим, чем Math.sqrt(i*i+j*j)
, результаты будут немного другими: лучшим будет 1322837333 с i=-6815 and j=70091
, но мой любимый 92821 (наименьшее столкновение -46272,46016
) снова почти так же хорошо, как и лучшее значение.
Я признаю, что это довольно спорно ли эти вычисления смысла на практике. Но я думаю, что брать 92821 за простое число имеет гораздо больше смысла, чем за 31, если только у вас нет веских причин не делать этого.