java的hashCode()是否确定?

时间:2013-05-08 15:56:56

标签: java hash search-engine hashcode

是java的hashCode()确定性吗?

我尝试实现一个使用minhashing算法的文档搜索引擎,并使用hashCode预先哈希单词。 每次运行它时,同一个单词是否会获得相同的哈希值?

即使我从不同的机器(32位对64位)运行它,它是否会获得相同的哈希值?

3 个答案:

答案 0 :(得分:11)

这取决于你所指的课程。由于基础Object.hashCode实施不是stated in the documentation

  

尽可能合理,Object类定义的hashCode方法确实为不同的对象返回不同的整数。 (这通常通过将对象的内部地址转换为整数来实现,但JavaTM编程语言不需要此实现技术。)

地址不是确定性的,考虑到有时它们甚至被用作熵的来源。

但是,例如,String具有确定性哈希码,确定如​​下:

Formula from Wikpedia

(图片取自维基百科)

在某些情况下,哈希码甚至没有合理的确定性定义。

答案 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对字符串稳定。