Java 如何从字符串的string.hashCode()值中获取字符串?

Java 如何从字符串的string.hashCode()值中获取字符串?,java,string,hash,hashcode,Java,String,Hash,Hashcode,我需要以某种方式从java中的散列中获取文本。 我有以下代码: String myString=新字符串(“creashaks-organzine”); int hashCode=myString.hashCode(); System.out.println(“哈希:“+hashCode”); 此代码的结果将为0。 但是“授粉沙盒”字符串的散列值也将是0 可能会有冲突,例如与“creashaks organzine”和“授粉沙盒”的冲突,我想找到类似于这种情况的冲突。由于我没有足够的声誉添加评

我需要以某种方式从java中的散列中获取文本。 我有以下代码:

String myString=新字符串(“creashaks-organzine”);
int hashCode=myString.hashCode();
System.out.println(“哈希:“+hashCode”);
此代码的结果将为0。 但是“授粉沙盒”字符串的散列值也将是0


可能会有冲突,例如与“creashaks organzine”和“授粉沙盒”的冲突,我想找到类似于这种情况的冲突。

由于我没有足够的声誉添加评论,我将引用另一个问题的解决方案

您知道,几个对象可以具有相同的hash(),正如java文档中提到的
Object.hashCode()

如果两个对象不相等,则不要求 *根据{@link java.lang.Object#equals(java.lang.Object)} *方法,然后对每个 *两个对象必须产生不同的整数结果

很明显,您无法从同一个哈希代码中恢复不同的对象,因此,简单的逻辑是根本不可能的


由于我没有足够的声誉来添加评论,我将引用另一个问题的解决方案

您知道,几个对象可以具有相同的hash(),正如java文档中提到的
Object.hashCode()

如果两个对象不相等,则不要求 *根据{@link java.lang.Object#equals(java.lang.Object)} *方法,然后对每个 *两个对象必须产生不同的整数结果

很明显,您无法从同一个哈希代码中恢复不同的对象,因此,简单的逻辑是根本不可能的


这是一件非常有趣的事情。关于中的规范,说明hashCode是根据字符串内容计算的,但示例似乎显示第一个字符串的情况并非如此:

class Main
{
    public static void main(String[] args)
    {
        String myString1 = "creashaks organzine";
        String myString2 = "crsomething else";
        String myString3 = "crsomething else";

        System.out.println("Hash1:" + myString1.hashCode());
        System.out.println("Hash2:" + myString2.hashCode());
        System.out.println("Hash3:" + myString3.hashCode());
    }
}
产出:

Hash1:0
Hash2:444616526
Hash3:444616526
Hash1:45678
但当我修改字符串时,会得到不同的输出:

String myString1 = "creashaks organzine...";
System.out.println("Hash1:" + myString1.hashCode());
产出:

Hash1:0
Hash2:444616526
Hash3:444616526
Hash1:45678
因此,似乎有人欺骗了我们,给出了一个非常罕见的示例字符串,该字符串正好生成“0”作为输出。在这里,您可以看到hashCode不是非常唯一的,因此无法安全地使用is来比较字符串

回到您最初的问题:hashCode是一个减少了细节的数字,因此您无法将其计算回原始字符串。这适用于所有哈希代码


散列码通常用于服务器端数据库,而不是真正的密码字符串。它们可以比较,但不能重建。

这是一件非常有趣的事情。关于中的规范,说明hashCode是根据字符串内容计算的,但示例似乎显示第一个字符串的情况并非如此:

class Main
{
    public static void main(String[] args)
    {
        String myString1 = "creashaks organzine";
        String myString2 = "crsomething else";
        String myString3 = "crsomething else";

        System.out.println("Hash1:" + myString1.hashCode());
        System.out.println("Hash2:" + myString2.hashCode());
        System.out.println("Hash3:" + myString3.hashCode());
    }
}
产出:

Hash1:0
Hash2:444616526
Hash3:444616526
Hash1:45678
但当我修改字符串时,会得到不同的输出:

String myString1 = "creashaks organzine...";
System.out.println("Hash1:" + myString1.hashCode());
产出:

Hash1:0
Hash2:444616526
Hash3:444616526
Hash1:45678
因此,似乎有人欺骗了我们,给出了一个非常罕见的示例字符串,该字符串正好生成“0”作为输出。在这里,您可以看到hashCode不是非常唯一的,因此无法安全地使用is来比较字符串

回到您最初的问题:hashCode是一个减少了细节的数字,因此您无法将其计算回原始字符串。这适用于所有哈希代码


散列码通常用于服务器端数据库,而不是真正的密码字符串。它们可以比较,但不能重建。

不可能“从散列中获取文本”。您可以使用该哈希代码将哈希代码映射到字符串,然后开始生成字符串排列以构建映射。这将是缓慢的建设和结果将是巨大的,但你可以找到一个简单的映射查找特定的哈希代码字符串候选人。你有任何代码吗?我是一个Java新手,我想不出一个需要查找
String.hashCode()
冲突的实际问题。如果你相信他们是不同的,那么你从错误的角度来处理任何问题。(或者请提供更多的背景来证明我错了)@OlafKock这不是现实世界的问题。它与游戏Minecraft有关,Minecraft使用String.hashCode()将任何字符串转换为int hashCode以生成游戏世界。我知道有很多字符串可以散列成相同的散列代码。我想写一个能找到这样字符串的程序。在这种情况下:你要么尝试多种组合,要么从数学上分析算法。不可能“从散列中获取文本”。您可以使用该哈希代码将哈希代码映射到字符串,然后开始生成字符串排列以构建映射。这将是缓慢的建设和结果将是巨大的,但你可以找到一个简单的映射查找特定的哈希代码字符串候选人。你有任何代码吗?我是一个Java新手,我想不出一个需要查找
String.hashCode()
冲突的实际问题。如果你相信他们是不同的,那么你从错误的角度来处理任何问题。(或者请提供更多的背景来证明我错了)@OlafKock这不是现实世界的问题。它与游戏Minecraft有关,Minecraft使用String.hashCode()将任何字符串转换为int hashCode以生成游戏世界。我知道有很多字符串可以散列成相同的散列代码。我想以某种方式编写一个程序,可以找到这样的字符串。在这种情况下:您需要尝试多种组合,或者从数学上分析算法。如果我想找到哈希函数的冲突,而不是原始字符串,该怎么办?我曾试图将此问题标记为链接问题的副本,但没有,因为另一个问题的根本问题是一个存储的密码,以及它们的验证,如果我想找到