9

有什么方法可以在java中使用字符串的哈希码并重新创建该字符串?

例如这样的:

String myNewstring = StringUtils.createFromHashCode("Hello World".hashCode());
if (!myNewstring.equals("Hello World"))
    System.out.println("Hmm, something went wrong: " + myNewstring);

我这样说是因为我必须将字符串转换为整数值,并从该整数值重构该字符串。

4

6 回答 6

6

这是不可能的。String 的哈希码是有损的;许多字符串值将产生相同的哈希码。一个整数有 32 位位置,每个位置有两个值。甚至没有办法将 32 个字符的字符串(例如)(每个字符都有很多可能性)映射到 32 位而不发生冲突。他们只是不适合。

如果您想使用任意精度算术(例如,BigInteger),那么您可以将每个字符作为一个整数并将它们连接在一起。瞧。

于 2011-06-13T18:31:42.260 回答
4

不可以。多个字符串可以具有相同的哈希码。理论上,您可以创建所有具有该哈希码的字符串,但它几乎是无限的。

于 2011-06-13T18:31:43.700 回答
2

恐怕不可能。想想看,哈希码是一个长值,即 8 个字节。一个字符串可能小于这个值,但也可能更长,你不能将一个更长的字符串压缩成 8 个字节而不会丢失一些东西。

如果我没记错的话,Java 哈希码算法每 8 个字节求和一次,所以你会丢失 8 个字节中的 7 个。如果您的字符串都很短,那么您可以将它们编码为 int 或 long 而不会丢失任何内容。

于 2011-06-13T18:34:14.663 回答
0

假设字符串仅由字母、数字和标点组成,因此大约有 70 个可能的字符。

log_70{2^32} = 5.22...

这意味着对于任何给定的整数,您都会找到一个 5 或 6 个字符的字符串,并将其作为其哈希码。所以,检索"Hello World":不可能;但"Hello"如果你幸运的话可能会起作用。

于 2012-08-14T11:58:14.960 回答
0

例如,“1019744689”和“123926772”的哈希码均为-1727003481。这证明对于任何整数,您都可能得到不同的结果(即reversehashcode(hashcode(string)) != string)。

于 2015-08-31T19:09:33.527 回答
0

你可以这样做:

char[] chars = "String here".toCharArray();
int[] ints = new int[chars.length];
for (int i = 0; i < chars.length; i++) {
    ints[i] = (int)chars[i];
}

然后:

char[] chars = new char[ints.length]
for (int i = 0; i < chars.length; i++) {
    chars[i] = (char)ints[i];
}
String final = new String(chars);

我还没有实际测试过......这只是“概念”代码。

于 2020-12-15T18:14:17.840 回答