我已经在similar question询问了.NET中的string.GetHashCode()
方法。从那时起,我了解到如果我们要在不同的机器上使用它,我们就不能依赖于buit-in类型的哈希代码的隐式实现。因此,我假设String.hashCode()
的Java实现在不同的硬件配置中也不稳定,并且可能在VM之间表现不同(不要忘记不同的VM实现)
目前我们正在讨论一种通过散列将字符串安全地转换为Java中的数字的方法,但是哈希算法必须在群集的不同节点之间保持稳定,并且要快速评估,因为会有很高的频率用法。我的队友坚持使用本地hashCode
方法,我需要一些合理的论据让他们重新考虑另一种方法。目前,我只考虑机器配置(x86和x64)之间的差异,可能是某些机器上的JVM的不同供应商(在我们的情况下几乎不适用)和字节顺序差异,这取决于算法所在的机器跑。当然,也可以考虑字符编码。
虽然所有这些事情都浮现在我脑海中,但我并不是100%肯定他们中的任何一个都有足够的理由,我很感激你在这方面的专业知识和经验。这将有助于我建立更强大的论据,以支持编写自定义哈希算法。另外,我很欣赏在实施时不要做的建议。
答案 0 :(得分:11)
文档中String.hashCode()
的实现为specified,因此保证一致:
String对象的哈希码计算为
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
使用int算术,其中s [i]是字符串的第i个字符,n是字符串的长度,^表示取幂。 (空字符串的哈希值为零。)
所有这些操作都是针对Java独立实现的 - 例如,平台字节顺序无关紧要。
那就是说,获取一个String
的方法可能很棘手,如果你从文件或其他字节源获取它。在这种情况下,只要您明确指定Charset
,就可以了。 (请注意,String
本身没有不同的编码;编码是byte[]
和String
之间转化的规范。)