java的hashCode()是确定性的吗?
我尝试实现一个使用minhashing算法的文档搜索引擎,并使用hashCode对单词进行预散列。是不是同一个词在每次运行时都会得到相同的哈希值?
即使我在不同的机器上运行它(32位与64位),它也会得到相同的哈希吗?
发布于 2013-05-08 16:02:45
这取决于您引用的类。因为,基本Object.hashCode
实现不是stated in the documentation
类Object定义的hashCode方法确实为不同的对象返回不同的整数。(这通常是通过将对象的内部地址转换为整数来实现的,但JavaTM编程语言不需要这种实现技术。)
地址不是确定性的,考虑到有时它们甚至被用作熵源。
但是,例如,String
具有如下确定的确定性哈希码:
(图片来自维基百科)
在某些情况下,甚至没有合理的确定性定义来定义哈希码。
发布于 2013-05-08 16:05:23
说到一般的对象:它不是。
但是,如果您专门讨论String
,则在String.hashCode()
的API中显式指定哈希码计算。
返回此字符串的哈希码。字符串对象的散列代码计算如下
s*31^(n-1) + s1*31^(n-2) + ... + sn-1
使用int算法,其中si是字符串的第i个字符,n是字符串的长度,^表示求幂。(空字符串的哈希值为零。)
换句话说:您应该能够依赖于字符串的hashCode是稳定的。
https://stackoverflow.com/questions/16445094
复制相似问题