是java的hashCode()确定性吗?
我尝试实现一个使用minhashing算法的文档搜索引擎,并使用hashCode预先哈希单词。 每次运行它时,同一个单词是否会获得相同的哈希值?
即使我从不同的机器(32位对64位)运行它,它是否会获得相同的哈希值?
答案 0 :(得分:11)
这取决于你所指的课程。由于基础Object.hashCode
实施不是stated in the documentation:
尽可能合理,Object类定义的hashCode方法确实为不同的对象返回不同的整数。 (这通常通过将对象的内部地址转换为整数来实现,但JavaTM编程语言不需要此实现技术。)
地址不是确定性的,考虑到有时它们甚至被用作熵的来源。
但是,例如,String
具有确定性哈希码,确定如下:
(图片取自维基百科)
在某些情况下,哈希码甚至没有合理的确定性定义。
答案 1 :(得分:4)
hashCode的一般合约是Javadoc说:
每当在执行Java应用程序期间多次在同一对象上调用它时,hashCode方法必须始终返回相同的整数,前提是不修改对象上的equals比较中使用的信息。 从应用程序的一次执行到同一应用程序的另一次执行,此整数不需要保持一致。
Is the same word going to get the same hash every time that I run it?
在执行应用程序期间,在相等的单词上调用hashCode()
(我假设该单词是String
实例并且equals()
中已覆盖String
)应该返回相同的整数。
编辑由于String.hashCode()
{{1}}指定了如何计算字符串的哈希码,因此它是确定性的。
Returns a hash code for this string. The hash code for a String object is computed as : s[0]*31^(n-1) + sjavadoc*31^(n-2) + ... + s[n-1]
答案 2 :(得分:3)
说到一般的对象:它没有。
但是,如果您正在特别谈论String
,那么在String.hashCode()
的API中明确指定了哈希码计算:
返回此字符串的哈希码。 String对象的哈希码计算为
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
使用int算术,其中s [i]是字符串的第i个字符,n是字符串的长度,^表示取幂。 (空字符串的哈希值为零。)
换句话说:你应该能够依赖hashCode对字符串稳定。