一个有趣的问题上来。我们遇到了一些代码,是使用 hashCode() 作为一个盐源MD5加密但这就提出了问题:将 hashCode() 返回的相同价值的相同的对象不同的虚拟机、不同JAVA的版本和操作系统?即使其不能保证,它改变了在任何一点到现在?

编辑:我是说真的 String.hashCode() 而不是更一般 Object.hashCode(), ,这当然可以复盖。

有帮助吗?

解决方案

没有。从 http://tecfa.unige.ch/guides/java/langspec-1.0/javalang.doc1.html:

一般合同哈希码是 下:

  • 每当它援引上相同的对象超过一次,在一个 执行Java应用程序, 哈希码必须始终如一地返回 同的整数。这可能是整数 积极的、消极,或者为零。此 整数并不需要 保持一致,从一个Java 应用到另一国,或从一个 执行应用到另一个 执行相同的应用程序。[...]

其他提示

它取决于本类型:

  • 如果你已经有了一个类型,它没有复盖哈希码()那么它可能会返回一个不同哈希码()每次运行程序。
  • 如果你已经有了一个类型复盖哈希码()但没有文档它是如何计算,这是完全合法的对象相同的数据,返回一个不同的散列在每个运行,只要其返回的同一散列的反复呼吁,在同一运行。
  • 如果你已经有了一个类型复盖哈希码()中的记录方式,即算法的一部分记录的行为,然后你可能是安全的。(java。郎。串的文件,这为例。) 然而,我还是会避开的 依赖 在这个一般原则,个人。

只是一个警示。净的世界:我已经看到至少几个人一个痛苦的世界通用的结果串。GetHashCode()作为他们的密码散在一个数据库。算法的改变之间。净1.1和2.0,突然间所有的散列是"错误的"。(杰弗里*里文件几乎完全相同的情况下在CLR通过。) 当哈希 需要储存,我想它来计算的方式 总是 保证稳定的-例如MD5或一个自定义的接口实施的类型与保证稳定。

根据 docs :String对象的哈希码计算为

s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]

我不确定这是正式规范还是Sun的实施。至少,它应该在所有现有的Sun VM上都是相同的,无论平台或操作系统如何。

没有。除非另有说明,否则无法保证散列算法。因此,例如,哈希结构的反序列化需要重新计算哈希码,并且这些值不应以序列化形式存储。

我想补充一点,您可以覆盖hashCode()(如果这样做,请不要忘记equals())以确保您的业务对象在任何地方返回相同的hashCode。那些对象至少会有一个可预测的hashCode。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top