Java 为什么Sun指定String.hashCode()实现?

Java 为什么Sun指定String.hashCode()实现?,java,string,hashcode,backwards-compatibility,Java,String,Hashcode,Backwards Compatibility,关于依赖String.hashCode()的当前实现是否安全,似乎一直存在争论,因为从技术上讲,它是由规范(Javadoc)保证的 为什么Sun在规范中指定了String.hashCode()的实现 为什么开发人员需要依赖hashCode()的特定实现 如果将来String.hashCode()发生变化,为什么太阳会如此担心天空会塌下来?(这可能可以用#2来解释) 依赖hashCode()的特定实现的一个原因是它是否被持久化到数据库、文件或任何其他存储介质中如果在哈希算法更改时读回数据,则会发生

关于依赖
String.hashCode()
的当前实现是否安全,似乎一直存在争论,因为从技术上讲,它是由规范(Javadoc)保证的

  • 为什么Sun在规范中指定了
    String.hashCode()
    的实现
  • 为什么开发人员需要依赖hashCode()的特定实现
  • 如果将来
    String.hashCode()
    发生变化,为什么太阳会如此担心天空会塌下来?(这可能可以用#2来解释)

  • 依赖hashCode()的特定实现的一个原因是它是否被持久化到数据库、文件或任何其他存储介质中如果在哈希算法更改时读回数据,则会发生不好的事情。您可能会遇到意外的散列冲突,更令人担忧的是,无法通过其散列找到某些内容,因为散列已在正在持久化的数据和“现在”之间更改

    事实上,这也很好地解释了第(3)点

    第1点的原因可能是“允许互操作性”。如果hashCode实现被锁定,那么数据可以在不同的Java实现之间非常安全地共享。i、 无论实现如何,给定对象的哈希值始终相同。

    自原始
    字符串以来,实现已更改。如果我记得的话,过去只有每16(?)个字符用于“长”字符串的哈希


    它可能被指定用于促进Java后续版本之间,甚至不同供应商的运行时之间的序列化互操作性。我同意,程序员不应该直接依赖于
    hashCode()
    的特定实现,但是更改它可能会破坏许多序列化集合。

    这一点很好!我想知道。。。如果不锁定hashCode(),他们能实现同样的目标吗?@Gili,如果不添加一个名为“implementationAndVersionIndependentHashCode()”的方法;-)@Gili如果他们不锁定哈希代码,他们怎么能确定通过RMI连接的两台机器可以来回传递哈希?我的猜测是,你必须放弃共享哈希的概念。@Rob和Bill:难道每个程序(即特定的DB或RMI实现)不能提供自己的锁定哈希函数,而不是在平台上锁定它吗?@Gili,yeup,当然可以-但到底有什么好处呢?:)最初的规范是抛出一个
    ArrayOUtOfBoundsException
    :)IIRC,长字符串的实现对固定数量的字符进行采样,因此O(1)而不是O(n),但是一个坏的散列,并且使用字符串进行任何有用的操作,无论如何都是(至少)O(n)。