【发布时间】:2010-10-21 13:39:32
【问题描述】:
Java 字符串的 hashCode 值计算为 (String.hashCode()):
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
在任何情况下(例如 JVM 版本、供应商等),以下表达式的计算结果是否为 false?
boolean expression = "This is a Java string".hashCode() == 586653468
更新 #1: 如果您声称答案是“是的,存在这种情况” - 那么请给出一个具体示例,说明何时“这是一个 Java 字符串”.hashCode() ! = 586653468。尽量做到具体/具体。
更新#2:我们都知道依赖 hashCode() 的实现细节通常是不好的。但是,我专门讨论的是 String.hashCode() - 所以请让答案集中在 String.hashCode() 上。 Object.hashCode() 与这个问题的上下文完全无关。
【问题讨论】:
-
你真的需要这个功能吗?为什么需要精确值?
-
@Brian:我正在尝试理解 String.hashCode() 的合同。
-
@Knorv 没有必要准确了解它是如何工作的——更重要的是了解合同及其不可告人的含义。
-
@mP:感谢您的意见,但我想这由我来决定。
-
为什么他们给第一个角色最大的权力?当您想优化速度以保留额外的计算时,您将存储前一个的功率,而前一个将是从最后一个字符到第一个字符。这意味着还会有缓存未命中。使用以下算法不是更有效吗: s[0] + s[1]*31 + s[2]*31^2 + ... + s[n-1]*31^[n-1 ] ?