String.hashCode()的int值是唯一的吗?

con*_*014 4 java string unique hashcode

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

pax*_*blo 10

独特,没有.本质上,哈希值不保证是唯一的.

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

因此,如果它基于哈希码,您将无法使用唯一的数据库密钥来存储它们.但是,您可以使用非唯一键来存储它们.

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

如果Java实现遵循Oracle文档(否则它不是真正的Java实现),它将在所有实现中保持一致.在为Oracle的文档String.hashCode指定计算的散列的固定式:

s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
Run Code Online (Sandbox Code Playgroud)

如果你使用的是疯狂的完全不同的Java 版本(比如1.2 vs 8),你可能想要检查这种情况,但是很长一段时间,至少从1.5开始就是这样.


Man*_*and 7

下面是JVM所做的String的hashCode计算.如上所述,它纯粹根据单个字符及其在String中的位置进行计算,并且没有任何内容依赖于JVM或运行JVM的机器类型,这将改变哈希码.

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

以下是按规格: -

public int hashCode()
Run Code Online (Sandbox Code Playgroud)

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

s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
Run Code Online (Sandbox Code Playgroud)

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


Abh*_*rai 7

没有,

由于Java中的字符串最多可以包含2,147,483,647(2 ^ 31-1)个字符,并且所有字符都会变化,因此将产生非常大的组合数量,但是integer的范围仅为-2,147,483,648到2,147,483,648。因此这是不可能的,并且使用此方法可以计算字符串的哈希码

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

范例:

如果创建两个字符串变量“ FB”和“ Ea”,则哈希码将相同。