Java从哈希码重新创建字符串

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

例如这样的事情:

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

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

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

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

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

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

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

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

log_70{2^32} = 5.22...

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

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