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

Java从哈希代码中重新创建字符串,java,string,hashcode,construct,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); char[] chars =

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

e、 g.类似这样的情况:

String myNewstring = StringUtils.createFromHashCode("Hello World".hashCode());
if (!myNewstring.equals("Hello World"))
    System.out.println("Hmm, something went wrong: " + myNewstring);
char[] chars = "String here".toCharArray();
int[] ints = new int[chars.length];
for (int i = 0; i < chars.length; i++) {
    ints[i] = (int)chars[i];
}

我这么说是因为我必须把一个字符串转换成一个整数值,然后从这个整数值重新构造这个字符串。

这是不可能的。字符串的哈希代码有损;许多字符串值将产生相同的哈希代码。整数有32位位置,每个位置有两个值。即使是32个字符串(例如,每个字符都有很多可能)也无法映射到32位而不发生冲突。它们就是不合身


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

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

恐怕不可能。想想看,hashcode是一个长值,即8字节。一个字符串可能比这个小,但也可能长得多,你不能把一个更长的字符串压缩成8字节而不丢失一些东西


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

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

log\u 70{2^32}=5.22…


这意味着对于任何给定的整数,您将找到一个5或6个字符的字符串,并将其作为哈希代码。因此,检索“Hello World”:不可能;但是如果你运气好的话,“Hello”可能有用。

例如,“1019744689”和“123926772”的哈希代码都是-172703481。这证明了对于任何整数,您可能会得到不同的结果(即,
反向hashcode(hashcode(string))!=string
)。

您可以这样做:

String myNewstring = StringUtils.createFromHashCode("Hello World".hashCode());
if (!myNewstring.equals("Hello World"))
    System.out.println("Hmm, something went wrong: " + myNewstring);
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=“String here”.tocharray();
int[]int=new int[chars.length];
for(int i=0;i
然后:

char[]chars=新字符[ints.length]
for(int i=0;i

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

你为什么首先要这样做?@Srinivas请阅读整个问题。@adarshr和详细的答案?我真的不在乎代码有多大,我只需要知道怎么做。长答案和短答案是一样的——只是更多的单词。。。。你还没有真正回答这个问题。为什么需要将字符串转换为整数值并返回?你打算怎么处理整数值?那我还有别的方法可以用吗?某种类型的编码?或者你可以压缩它。使用java.util.zipn“Zip”字符串加密或压缩都可以解决问题中所述的问题。这些并不是用来解决数据丢失问题的神奇术语。那么,我还能用别的方法吗?某种类型的编码?@Richard,以10为底是你正在使用的编码。@Richard你需要的是加密/解密。@Marcelo,关于使用什么加密有什么建议吗?我真不敢相信使用加密的想法是多么愚蠢。谁能从32位的密文中恢复可能无限长的消息呢?显然,除了极少数例外,在Java的hashCode操作下,所有英语单词都映射到一个不同的数字。因此,如果你有一个单词的散列,你可以通过字典检查散列代码,并且有很高的机会恢复原始单词。这确实是一个非常有趣的发现。唉,这个问题意味着要存储任意字符串,或者至少是多个单词的序列。