2019-04-06 15:53

# Java 关于如何override hashcode的问题

1. FList (定义一个list)
2. FSet (定义一个set）
3. FMap（定义一个map）

If m1 and m2 are values of the FMap ADT, and

``````    ! (m1.equals(m2))

then m1.hashCode() is unlikely to be equal to m2.hashCode().
``````

Note: The word "unlikely" will be interpreted as follows. For every type K and V, if both m1 and m2 are selected at random from a set of FMap values such that for every non-negative integer n and int value h the probability of a randomly selected FMap m having

n == m.size() is

``````P(n) = 1/(2^(n+1))
``````

and for each key k such that m.containsKey(k) the probability that

``````     h == k.hashCode() is at most 1/5
``````

and for each value v such that v.equals(m.get(k)) the probability that

``````     h == v.hashCode() is at most 1/5
``````

and the three probabilities above are independent

then the probability of m1.hashCode() == m2.hashCode() when m1 and m2 are not equal is less than 40%.

• 点赞
• 写回答
• 关注问题
• 收藏
• 邀请回答

#### 1条回答默认 最新

• 不是hashcode m1和m2相等概率小于40%，而是在 m1 m2 不相等的情况下，hashcode相等的概率小于40%（这个概率一般叫做hash碰撞率）

如果m1和m2相等，则hashcode必须100%相等
40%其实基本上你可以无视了，除非你根本没有任何算法，否则不会触及到这么高的。
一个典型的做法，就是把lst的每个元素的hashcode相加，最后取一个余数，就可以满足题意了。

点赞 评论