Best implementation for hashCode method for a collection

后端 未结 20 3418
难免孤独
难免孤独 2020-11-22 01:39

How do we decide on the best implementation of hashCode() method for a collection (assuming that equals method has been overridden correctly) ?

20条回答
  •  一个人的身影
    2020-11-22 02:34

    The standard implementation is weak and using it leads to unnecessary collisions. Imagine a

    class ListPair {
        List first;
        List second;
    
        ListPair(List first, List second) {
            this.first = first;
            this.second = second;
        }
    
        public int hashCode() {
            return Objects.hashCode(first, second);
        }
    
        ...
    }
    

    Now,

    new ListPair(List.of(a), List.of(b, c))
    

    and

    new ListPair(List.of(b), List.of(a, c))
    

    have the same hashCode, namely 31*(a+b) + c as the multiplier used for List.hashCode gets reused here. Obviously, collisions are unavoidable, but producing needless collisions is just... needless.

    There's nothing substantially smart about using 31. The multiplier must be odd in order to avoid losing information (any even multiplier loses at least the most significant bit, multiples of four lose two, etc.). Any odd multiplier is usable. Small multipliers may lead to faster computation (the JIT can use shifts and additions), but given that multiplication has latency of only three cycles on modern Intel/AMD, this hardly matters. Small multipliers also leads to more collision for small inputs, which may be a problem sometimes.

    Using a prime is pointless as primes have no meaning in the ring Z/(2**32).

    So, I'd recommend using a randomly chosen big odd number (feel free to take a prime). As i86/amd64 CPUs can use a shorter instruction for operands fitting in a single signed byte, there is a tiny speed advantage for multipliers like 109. For minimizing collisions, take something like 0x58a54cf5.

    Using different multipliers in different places is helpful, but probably not enough to justify the additional work.

提交回复
热议问题