根据Java文档,String
对象的hash code计算为:
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
使用
int
算术,其中s[i]
是
为什么使用31作为乘数?
我知道乘数应该是一个相对较大的质数.那么,为什么不是29,或者37,甚至97呢?
根据Java文档,String
对象的hash code计算为:
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
使用
int
算术,其中s[i]
是
为什么使用31作为乘数?
我知道乘数应该是一个相对较大的质数.那么,为什么不是29,或者37,甚至97呢?
According to Joshua Bloch's Effective Java (a book that can't be recommended enough, and which I bought thanks to continual mentions on stackoverflow):
Select 值31是因为它是奇数素数.如果是偶数,乘法溢出,信息就会丢失,因为乘以2等于移位.使用素数的好处不那么明显,但它是传统的.31的一个很好的特性是,乘法可以用移位和减法代替,以获得更好的性能:
31 * i == (i << 5) - i
.现代虚拟机会自动进行这种优化.
(from Chapter 3, Item 9: Always override hashcode when you override equals, page 48)个