Java从哈希码创建字符串

时间:2011-06-13 18:27:47

标签: java string hashcode construct

有没有办法在java中使用字符串的哈希码,并重新创建该字符串?

e.g。像这样的东西:

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

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

6 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:4)

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

答案 2 :(得分:2)

不可能我害怕。考虑一下,哈希码是一个长值,即8个字节。字符串可能小于此但也可能更长,您不能将更长的字符串压缩为8个字节而不会丢失某些内容。

如果我没记错的话,Java哈希码算法会将每8个字节求和,这样你就会失去8个字节中的7个字节。如果你的字符串都非常短,那么你可以将它们编码为int或long而不会丢失任何东西。

答案 3 :(得分:0)

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

log_70{2^32} = 5.22...

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

您可以执行以下操作:

*{

margin: 0px;
padding : 0px;

}

然后:

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

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