从它的 hashCode 中获取一个 String 值

Get a String value from its hashCode

有没有一种简单的方法可以使用哈希码获取字符串的值?让我解释一下:

我有一个字符串变量,其值为 Hello Guys。它保存在这里:String@dye63g。现在,我想从 String@dye63g.

中获取字符串值 Hello Guys

根据您对这个问题的评论,您的问题实际上是在问:

对于一个 class 而不是 覆盖 java.lang.Object 本身的默认值 toString() 的对象,我可以再次导出该值吗?

答案是否定的。它 不是哈希 。它是完全限定的 class 名称,一个 @ 符号,然后是十六进制数字(因此是 0-9a-f,而不是像您的示例中的 y 和 g),System.identityHashCode(obj) 返回的值。

此代码与它的值没有任何关系,也不是该对象的哈希码。它通常是它的内存地址或对该原则的一些修改。

你可以简单地测试一下:

class Test {
  public static void main(String[] args) {
    System.out.println(System.identityHashCode("Hey, there!"));
  }
}

运行那几次。相同的值 可能 出来(这取决于你的系统和 VM 实现),但现在 运行 相同的代码在不同的 VM 上,或在不同的计算机上,或重新启动并再次 运行 。不同的价值观出来了。那应该很明显你不能。

第二个问题是鸽巢原则。该散列值始终恰好是 32 位长(为什么?好吧,System.identityHashCode returns 和 int 而那些只有 32 位。每个字母 (0-9a-f) 代表 4 个字节,因此为什么 @ 之后的那个东西总是 8 个字符长:每个字符是 4 位,8*4 = 32.

你也可以测试一下。 Copy/paste 将莎士比亚全集整合成一个巨大的字符串,现在调用 identityHashCode - 它仍然只是一个小数字。

int 可以表示 40 亿个不同的数字,仅此而已。然而,可以想象到的字符串有超过 40 亿个(事实上,它们的数量是无限的)。因此,一定存在无限数量的不同字符串,它们恰好散列为 1234abcd。因此,给定散列 1234abcd,不可能说出它是由哪个字符串产生的——毕竟,存在无数个散列为该值的字符串。并且假设散列是 'constant'(相同的字符串导致相同的散列,例如字符串自己的 .hashCode() 方法)。 System.identityHashCode 甚至都不是,实际上与实际值完全没有关系。您获得的数量实际上取决于启动 JVM 时系统的内存负载,或多或少。