是否有可能从其哈希码中获取String值?

时间:2014-03-05 20:28:33

标签: java string hashcode

方法String#hashCode()的Java doc说:

  

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

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

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

问题:

  • 是否可以为具有不同值的两个字符串对象使用相同的哈希码?如果是,那么请分享一些例子。
  • 是否可以从哈希码中获取String值?

我没有在代码中的任何地方使用它。我刚刚问了这个问题,以便更多地了解Java String类。

4 个答案:

答案 0 :(得分:4)

  

对于具有不同值的两个字符串对象,是否可以使用相同的哈希码?如果是,那么请分享一些例子。

以下是具有相同哈希码的randomly generated examples短字符串的小样本:

String 1   String 2   Common hash code
--------   --------   ----------------
VTBHKIGV - FLXCLLII        -1242944431
FPESRBAH - GNFWMYVA         1778061647
UYDHRTXL - HGCNRCBE         1509241566
VXQMFMDE - YMYXDWKK        -1553987354
VGWBSYRX - JZNQSUXK          700334696

由于多个字符串可以共享相同的哈希码,因此无法从哈希中恢复原始字符。

答案 1 :(得分:3)

  

是否可以为具有不同值的两个字符串对象使用相同的哈希码?

是的,如何在没有它的情况下将无限字符串可能性映射到int

  

是否可以从其哈希码中获取String值?

不,请阅读1

答案 2 :(得分:1)

绝对有可能有两个具有相同哈希码的不同字符串(或对象)。这就是我们进行碰撞处理的原因。因此,通常不可能从哈希码中获取字符串值。这是因为对于长度超过4个字节的字符串,哈希码值会快速溢出32位整数。

答案 3 :(得分:0)

假设您的字符串长度为2个字符

C1,C2

你的哈希是31 * c1 + c2

你能想到映射到同一个哈希的不同值吗?

在较长的字符串中更糟糕