8

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

  1. 为什么 SunString.hashCode()在规范中指定 ' 的实现?
  2. 为什么开发人员需要依赖 hashCode() 的特定实现?
  3. 为什么太阳这么怕String.hashCode()以后换了天就塌了?(这可能由#2 解释)
4

2 回答 2

8

依赖 hashCode() 的具体实现的一个原因是它是否被持久化到数据库、文件或任何其他存储介质中。如果在散列算法发生变化时读回数据,就会发生坏事(tm)。您可能会遇到意外的哈希冲突,更令人担忧的是,由于哈希在被持久化的数据和“现在”之间发生了变化,因此无法通过哈希找到某些东西。

事实上,这也解释了第 3 点 =)

第 1 点的原因可能是“允许互操作性”。如果 hashCode 实现被锁定,那么数据可以在 Java 的不同实现之间非常安全地共享。即,给定对象的散列将始终相同,而与实现无关。

于 2010-02-12T23:00:54.213 回答
4

自原始课程以来,实施已经改变。String如果我记得,过去只有每 16 个(?)字符用于“长”字符串的散列。

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

于 2010-02-12T23:06:04.263 回答