是String.hashCode()的int值,该值是唯一的



我几天前遇到了一个问题。现在我有数以千万计的单词,字符串类型。现在我决定将它们保存在数据库中,并使用索引来保持它们的唯一性。我不想为了保持它们的独特性而对原始单词进行比较。我想确定字符串的hashCode()方法是否是唯一的,如果使用另一台笔记本电脑或不同的时间或类似的东西,它不会改变吗?

唯一,否。从本质上讲,哈希值不能保证是唯一的。

任何具有任意大量可能输入和有限数量输出的系统都会发生冲突。

因此,如果仅基于哈希代码,则不能使用唯一的数据库密钥来存储它们。但是,您可以使用非唯一密钥来存储它们。

在回答您的第二个问题时,关于不同版本的Java是否会为同一字符串生成不同的哈希码,没有。

如果Java实现遵循Oracle文档(否则它就不是真正的Java实现),那么它在所有实现中都是一致的。String.hashCode的Oracle文档指定了一个固定的哈希计算公式:

s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]

如果您使用的是完全不同的版本的Java(例如1.2和8),您可能需要检查一下,但这种情况已经持续了很长一段时间,至少从1.5开始是这样。

否,

因为java中的字符串最多可以有2147483647(2^31-1)个字符,并且所有字符都会有所不同,所以它会产生很大的组合,但整数的范围只有-2147483648到2147483648。所以这是不可能的,使用这种方法可以计算字符串的哈希代码

s[0]*31^(n-1)+s[1]*31^[(n-2)+…+s[n-1]。

示例:

若您创建两个字符串变量作为"FB"one_answers"Ea",那个么散列代码将是相同的。

下面是JVM对字符串进行的hashCode计算。如前所述,它完全根据单个字符及其在字符串中的位置进行计算,没有任何内容依赖于JVM或运行JVM的机器类型,这会改变哈希代码。

这也是为什么String类被声明为final的原因之一(不可扩展导致不变性),这样就不会有人改变它的行为。

以下是根据规范:-

public int hashCode()

返回此字符串的哈希代码。String对象的哈希代码计算为

s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]

使用int算术,其中s[i]是字符串的第i个字符,n是字符串的长度,^表示取幂。(空字符串的哈希值为零。)

相关内容

最新更新