从它的 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 时系统的内存负载,或多或少。
有没有一种简单的方法可以使用哈希码获取字符串的值?让我解释一下:
我有一个字符串变量,其值为 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 时系统的内存负载,或多或少。