在我定义的Java对象中,如何覆盖返回具有唯一实体ID的唯一hashcode值的hashcode方法?

在我定义的Java对象中,如何覆盖返回具有唯一实体ID的唯一hashcode值的hashcode方法?,java,map,hashmap,compare,hashcode,Java,Map,Hashmap,Compare,Hashcode,我面临一个使用复杂映射的案例,该映射使用我定义的Java对象作为其键,为此,该对象的类需要实现接口Compariable并覆盖对象的hashcode和equals方法,我想使用该类对象的唯一ID作为hashcode,但唯一ID是Long类型,hashcode返回值的类型是Integer,如果对象的ID增加到非常大的值,则可能会发生数据损坏和不一致。所以我想问一下,是否有任何方法可以将一个唯一的长类型ID转换为一个hashcode,该hashcode也可以用于在对象之间进行标识 提前谢谢 您可以简

我面临一个使用复杂映射的案例,该映射使用我定义的Java对象作为其键,为此,该对象的类需要实现接口Compariable并覆盖对象的hashcode和equals方法,我想使用该类对象的唯一ID作为hashcode,但唯一ID是Long类型,hashcode返回值的类型是Integer,如果对象的ID增加到非常大的值,则可能会发生数据损坏和不一致。所以我想问一下,是否有任何方法可以将一个唯一的长类型ID转换为一个hashcode,该hashcode也可以用于在对象之间进行标识


提前谢谢

您可以简单地调用Long的hashcode方法

例如:


新的Long(4).hashCode()

最简单的解决方案是依赖
java.lang.Long
的内置
hashCode()

编辑:
根据下面的注释,如果id存储为
java.lang.Long
而不是原语
Long
,则更简单:

@Override
public int hashCode() {
    return getId().hashCode();
}

对于
hashCode()
方法,主Java库将
long
转换为
int
的最常见方式是使用两个位操作:

@Override
public int hashCode() {
    return (int)(value ^ (value >>> 32));
}
首先,在Java 8中,有一个静态方法可以做到这一点:

@Override
public int hashCode() {
    return Long.hashCode(value);
}

请注意,此过程是不可逆的-由于范围不同,没有从
long
值到其哈希代码的一对一映射。

此方法可能存在轻微的性能问题-
valueOf()
通常会创建一个新对象。JVM可能会在堆栈上创建它,但我不确定它是否足够聪明以避免创建它。呵呵,实际上在我的情况下,我甚至不需要创建新的长实例,因为它已经存在于我的对象中,我只需要使用hashcode方法:返回这个.getId().hashcode()@BradyChu:好吧,在这种情况下这并不重要:-)但是如果你想知道,一个小小的JMH基准测试表明
valueOf()
方法比Java 8上的
Long.hashCode(Long)
静态方法慢大约3倍。取决于应用程序,这实际上可能很重要…感谢您的回答。
@Override
public int hashCode() {
    return Long.hashCode(value);
}