我遇到了一个ago.Now的问题,我有几千万字,类型的字符串。现在,我决定将它们保存在数据库中,并使用索引来保持它们的唯一性( unique.And )。我不想通过比较原始单词来保持它们的唯一性。我想确定字符串的hashCode()方法是否可以是唯一的,如果使用另一台笔记本电脑或不同的时间或类似的东西,它会不会改变?
发布于 2014-09-09 12:15:05
下面是JVM执行的字符串的hashCode计算。如上所述,它纯粹基于单个字符及其在字符串中的位置进行计算,并且没有任何依赖于JVM或运行JVM的机器类型的内容会改变哈希码。
这也是为什么String类被声明为final (不可扩展,导致不可变性)的原因之一,这样就不会有人改变它的行为。
以下是根据规格:
public int hashCode()
返回此字符串的哈希代码。字符串对象的散列代码计算如下
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
使用整数运算,其中s[i]
是字符串的第i个字符,n是字符串的长度,^表示求幂。(空字符串的哈希值为零。)
发布于 2014-09-09 12:05:09
独一无二,不。从本质上讲,不能保证哈希值是唯一的。
任何具有任意数量的可能输入和有限数量的输出的系统都将发生冲突。
因此,如果只基于散列代码,您将无法使用唯一的数据库键来存储它们。但是,您可以使用非唯一键来存储它们。
对于您的第二个问题,不同版本的Java是否会为同一字符串生成不同的哈希码,答案是否定的。
如果Java实现遵循Oracle文档(否则就不是真正的Java实现),那么它在所有实现中都是一致的。Oracle docs for String.hashCode
指定用于计算散列的固定公式:
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
如果您使用的是截然不同的Java版本(比如1.2vs8),那么您可能需要检查一下,但这种情况已经存在很长一段时间了,至少从1.5开始就是这样。
发布于 2017-10-11 18:39:46
不,
因为java中的字符串最多可以有2,147,483,647 (2^31 - 1)个字符,并且所有字符都会有所不同,所以它将产生非常大的no个组合,但是整数的范围只有-2,147,483,648到2,147,483,648。因此,这是不可能的,并且使用此方法计算字符串的散列码
s*31^(n-1) + s1*31^(n-2) +…+ sn-1。
示例:
如果你创建了两个字符串变量"FB“和"Ea”,那么散列代码将是相同的。
https://stackoverflow.com/questions/25736486
复制相似问题