I recommend using 92821. Here's why.
To give a meaningful answer to this you have to know something about the possible values of i
and j
. The only thing I can think of in general is, that in many cases small values will be more common than large values. (The odds of 15 appearing as a value in your program are much better than, say, 438281923.) So it seems a good idea to make the smallest hashcode collision as large as possible by choosing an appropriate prime. For 31 this rather bad - already for i=-1
and j=31
you have the same hash value as for i=0
and j=0
.
Since this is interesting, I've written a little program that searched the whole int range for the best prime in this sense. That is, for each prime I searched for the minimum value of Math.abs(i) + Math.abs(j)
over all values of i,j
that have the same hashcode as 0,0
, and then took the prime where this minimum value is as large as possible.
Drumroll: the best prime in this sense is 486187739 (with the smallest collision being i=-25486, j=67194
). Nearly as good and much easier to remember is 92821 with the smallest collision being i=-46272 and j=46016
.
If you give "small" another meaning and want to be the minimum of Math.sqrt(i*i+j*j)
for the collision as large as possible, the results are a little different: the best would be 1322837333 with i=-6815 and j=70091
, but my favourite 92821 (smallest collision -46272,46016
) is again almost as good as the best value.
I do acknowledge that it is quite debatable whether these calculation make much sense in practice. But I do think that taking 92821 as prime makes much more sense than 31, unless you have good reasons not to.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…