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开始就是这样.
下面是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是字符串的长度,^表示取幂.(空字符串的哈希值为零.)
没有,
由于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”,则哈希码将相同。