将类的哈希码用作serialVersionUID是否明智?

时间:2019-05-13 09:31:39

标签: java serialization

我注意到在我公司的代码库中,常见的模式是将类的serialVersionUID设置为该类的哈希码,如下所示:

public final class ClassName implements Serializable {

    private static final long serialVersionUID = ClassName.class.hashCode();

    [...]

}

这是设置类的serialVersionUID的有效方法吗?

2 个答案:

答案 0 :(得分:6)

Class没有明确定义的hashCode()方法,因此它不是稳定的。

这意味着您可以(而且很可能)在不同的运行之间获得MyClass.class.hashCode()的不同结果,即使在相同的JVM上,也可以确定地在不同的JVM实现和/或版本之间。< / p>

这意味着来自任何一个JVM的序列化数据可能只能在同一JVM中使用。

现在,可能被用作避免跨虚拟机通信使用序列化的有意方式(它不是“安全机制”或类似的东西,但可以用来快速检测使用序列化进行跨VM通信的尝试)。但是,如果这是目标,那么使用随机数进行平坦处理可能会更好。

答案 1 :(得分:3)

这是一个可怕的想法。如何计算hashCodeClass::hashCodeObject::hashCode)有多种策略。在java-8下,默认值为Marsaglia-XOR-Shift,这是一个伪随机生成器,它将为您提供int;但这可能会因VM的不同而有所变化,并且也有多种方法可以从同一版本进行更改,有关详细信息,请参见this answer