Java的hashCode()方法是确定性的吗?
我正在尝试实现一个使用minhashing算法的文档搜索引擎,我使用hashCode对单词进行预处理。 同样的单词每次运行时会获得相同的哈希值吗?
如果我从不同的机器上运行它(32位和64位),它是否会获得相同的哈希值?
Java的hashCode()方法是确定性的吗?
我正在尝试实现一个使用minhashing算法的文档搜索引擎,我使用hashCode对单词进行预处理。 同样的单词每次运行时会获得相同的哈希值吗?
如果我从不同的机器上运行它(32位和64位),它是否会获得相同的哈希值?
Object.hashCode
实现不是确定性的,因为正如文档中所述:
地址是不确定的,有时甚至被用作熵的来源。尽可能合理地说,由Object类定义的hashCode方法确实会为不同的对象返回不同的整数。(通常通过将对象的内部地址转换为整数来实现,但这种实现技术并非JavaTM编程语言所必需的。)
String
具有确定性哈希码,如下所示:
(图片来自维基百科)
在某些情况下,哈希码甚至没有一个合理的确定性定义。
hashCode的一般契约如Javadoc所述:
在Java应用程序执行期间,如果同一对象被多次调用hashCode方法,则只要对象上用于equals比较的信息未修改,hashCode方法必须始终返回相同的整数。但是,该整数不需要在同一应用程序的另一个执行中保持一致。
每次运行相同的单词是否会得到相同的哈希值?
在应用程序执行期间,对等单词(我假设单词是String实例,并且在String中已重写equals())调用hashCode()应返回相同的整数。
编辑 由于javadoc中指定了如何计算String的哈希码,因此它是确定性的。
返回此字符串的哈希码。String对象的哈希码计算方式为: s[0]*31^(n-1) + s1*31^(n-2) + ... + s[n-1]hashcode
都是明确定义且确定性的。 - assyliasList
接口基于其元素定义其哈希值,因此如果所有元素都具有确定性哈希(例如,它们都是 String
类型),那么该列表也会具有确定性哈希。 - yshavit说到总体的对象:它们不会。
但是如果你特别指的是String
,那么hashcode的计算在String.hashCode()
的API中有详细说明:
换句话说:您应该可以依赖于字符串的hashCode稳定。Returns a hash code for this string. The hash code for a String object is computed as
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
using int arithmetic, where s[i] is the ith character of the string, n is the length of the string, and ^ indicates exponentiation. (The hash value of the empty string is zero.)