有一章关于hashcode生成函数如下叙述:
The value 31 was chosen because it is
an odd prime. If it were even and the multiplication overflowed, information
would be lost, as multiplication by 2 is equivalent to shifting. The advantage of
using a prime is less clear, but it is traditional. A nice property of 31 is that the
multiplication can be replaced by a shift and a subtraction for better performance:
31 * i == (i << 5) - i. Modern VMs do this sort of optimization automatically.主要是关于 result = 31 * result + c 这个式子中为什么用31,他说31是奇数,不是偶数,如果是偶数且乘法造成溢出的话,信息就会丢失,因为乘以2就相当于移位,那我就有个疑惑了,乘31就不会造成信息丢失了?乘2是移位,乘31的过程其实也是包含移位的

解决方案 »

  1.   

    乘31和2都会溢出造成信息丢失,但是乘2更容易导致低位都变成0从而导致hashcode一样的概率变大
      

  2.   

    <<effective java 2nd>>from Chapter 3, Item 9: Always override hashcode when you override equals, page 48
      

  3.   

    我觉得这里可能解释出了原因
    http://stackoverflow.com/questions/299304/why-does-javas-hashcode-in-string-use-31-as-a-multiplier
      

  4.   

    我想来想去感觉31没理由不溢出,那就是他的描述感觉有语病似的~
    选择31这类odd prime的数,至少就是让hash值最大程度散布,降低碰撞可能~
    有一篇我觉得也说得挺好的
    For what it's worth, Effective Java 2nd Edition hand-waives around the mathematics issue and just say that the reason to choose 31 is:    * Because it's an odd prime, and it's "traditional" to use primes
        * It's also one less than a power of two, which permits for bitwise optimizationHere's the full quote, from Item 9: Always override hashCode when you override equals:    The value 31 was chosen because it's an odd prime. If it were even and multiplication overflowed, information would be lost, as multiplication by 2 is equivalent to shifting. The advantage of using a prime is less clear, but it is traditional.    A nice property of 31 is that the multiplication can be replaced by a shift (§15.19) and subtraction for better performance:     31 * i == (i << 5) - i    Modern VMs do this sort of optimization automatically.    While the recipe in this item yields reasonably good hash functions, it does not yield state-of-the-art hash functions, nor do Java platform libraries provide such hash functions as of release 1.6. Writing such hash functions is a research topic, best left to mathematicians and theoretical computer scientists.    Perhaps a later release of the platform will provide state-of-the-art hash functions for its classes and utility methods to allow average programmers to construct such hash functions. In the meantime, the techniques described in this item should be adequate for most applications.Rather simplistically, it can be said that using a multiplier with numerous divisors will result in more hash collisions. Since for effective hashing we want to minimize the number of collisions, we try to use a multiplier that has fewer divisors. A prime number by definition has exactly two distinct, positive divisors.
      

  5.   

    a*31 = a*16+a*8+a*4+a*2+a
    相当于把a左移4,3,2,1位再加上它自己,是为了把关于这个数的信息尽量分散到更多的位置上吧