为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

至尊宝的传说 2019-11-27 12:57:21
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()完全不相关。
查看完整描述

3 回答

?
繁星coding

TA贡献1797条经验 获得超4个赞

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


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


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


查看完整回答
反对 回复 2019-11-27
?
守候你守候我

TA贡献1802条经验 获得超10个赞

您不应该依赖等于特定值的哈希码。只是它将在同一执行中返回一致的结果。API文档说以下内容:


hashCode的一般约定为:


在Java应用程序的执行过程中,只要在同一对象上多次调用它,则hashCode方法必须一致地返回相同的整数,前提是未修改该对象的equals比较中使用的信息。从一个应用程序的执行到同一应用程序的另一执行,此整数不必保持一致。

编辑 由于String.hashCode()的javadoc指定了字符串的哈希码的计算方式,因此任何违反此规定的行为都会违反公共API规范。


查看完整回答
反对 回复 2019-11-27
  • 3 回答
  • 0 关注
  • 589 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信