【问题标题】:Is it possible to get String value back from its hash code?是否可以从其哈希码中获取 String 值?
【发布时间】:2014-03-05 20:28:32
【问题描述】:

String#hashCode() 方法的 Java 文档说:

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

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

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

问题:

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

我没有在代码中的任何地方使用它。我刚刚问了这个问题是为了了解更多关于 Java String 类的信息。

【问题讨论】:

  • 是否可以为具有不同值的两个字符串对象使用相同的哈希码? 是的。 是否可以从哈希码中取回 String 值? 不可以。
  • 哈希码是 32 位长。您可以拥有数千字节长的字符串。没有办法将字符串唯一地编码为哈希码。
  • 非常感谢您提供的示例。我错了,字符串对象总是返回唯一的哈希码。
  • 实际上我正在使用 HashMap 其中键是数据库查询的哈希码,值是在 infinispan 中缓存它的响应。但现在它可能会产生一个问题,即两个不同的查询生成相同的哈希码。
  • 它曾经非常糟糕,回到 Java 1.0.2 左右。就像任何超过 10 个字符的字符串都可能具有相同的哈希值。

标签: java string hashcode


【解决方案1】:

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

以下是具有相同哈希码的短字符串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

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

【讨论】:

    【解决方案2】:

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

    是的,如果没有它,你如何将无限的字符串可能性映射到int

    是否可以从哈希码中取回字符串值?

    不,阅读 1

    【讨论】:

    • 请分享一些具有相同哈希码但值不同的示例。
    • Java 字符串远非无限:只有 (2^16-1) ^ (2^31-1) 种可能性。 (或者更多一点,因为字符串是可变长度的)
    【解决方案3】:

    绝对有可能有两个不同的字符串(或对象)具有相同的哈希码。这就是我们有碰撞处理的原因。所以一般来说,不可能从哈希码中取回字符串值。这是因为对于长度超过 4 个字节的字符串,哈希码值会很快溢出 32 位整数。

    【讨论】:

      【解决方案4】:

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

      c1,c2

      你的哈希是 31*c1 + c2

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

      较长的字符串会更糟

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-19
        • 1970-01-01
        • 2011-07-05
        • 2016-07-22
        • 1970-01-01
        • 2011-06-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多