Java 为什么这是` hashCode()的一个很好的实现`

Java 为什么这是` hashCode()的一个很好的实现`,java,overriding,equals,hashcode,Java,Overriding,Equals,Hashcode,我看到一个代码重写了equals(),可以理解,它相应地重写了hashcode() @Override public int hashCode() { int result = id; result = 31 * result + (int) (providerId ^ (providerId >>> 32)); result = 31 * result + (int) (promotionId ^ (promotionId >>>

我看到一个代码重写了
equals()
,可以理解,它相应地重写了
hashcode()

 @Override
 public int hashCode() {
     int result = id;
    result = 31 * result + (int) (providerId ^ (providerId >>> 32));
    result = 31 * result + (int) (promotionId ^ (promotionId >>> 32));
    result = 31 * result + (coordinate != null ? coordinate.hashCode() : 0);
    return result;
 }
有人能解释一下为什么这个哈希代码好吗? 为什么它对特定对象是唯一的

>
>
相比意味着什么? 我认为
>
dox位向右移动,就像乘以2一样

但是
>>
是什么意思呢

有人能解释一下为什么这个哈希代码好吗?为什么它对特定对象是唯一的

不是,;本质上没有哈希代码函数。两个对象具有相同的哈希代码是很少见的,这并非不可能

>>与>>>是什么意思?我认为>>do x位向右移动,就像乘以2一样

但是>>>是什么意思呢


这是一个未签名的右移
>
如果第一位已经是
1
>>
则以1s向左移位,无论原始位是什么,
>>
都以0s移位。

您如何知道这是好的?请注意,哈希函数不必每个相等的对象都是唯一的。在这种情况下,相等的对象必须具有相等的哈希代码,但相反的情况并非如此:不相等的对象不必具有不相等的哈希代码。例如,考虑字符串。理论上有无限多个字符串(“a”、“aa”、“aaa”…),但只有2^32个不同的整数值。因为无穷大大于2^32,所以一定有一些字符串不相等,但具有相同的整数哈希代码。但是这种模式会使这种哈希变得罕见吗?我试着去理解为什么?这些碎片通常是什么样子的。或者我不应该这样想?散列函数的目的是尽可能多地乱码,越乱越好。不要试图计算结果中的位是什么样子的。