一尘不染

Java字符串上hashCode()的一致性

javascript

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()完全不相关。


阅读 329

收藏
2020-09-27

共1个答案

一尘不染

我可以看到该文档最早可以追溯到Java 1.2。

的确,总的来说,您不应该依赖散列码实现,而是将其记录为的行为java.lang.String,因此,对其进行更改将视为违反现有合同。

只要有可能,你不应该依赖于哈希码跨版本等保持相同-但在我的脑海里java.lang.String完全是因为算法的特殊情况已经指定了......只要你愿意放弃与以前版本的兼容性当然指定了算法。

2020-09-27