Java 两个字符串:相同的哈希代码

Java 两个字符串:相同的哈希代码,java,string,collision,hashcode,Java,String,Collision,Hashcode,我必须用相同的哈希代码生成两个字符串。我对它进行了研究,我达到的最大值是只更改字符串的前两个字符 public static String same(String s) { String re = ""; char c = 0; char ch = 0; for (int i = 0; i < s.length(); i++) { c = (char) (s

我必须用相同的哈希代码生成两个字符串。我对它进行了研究,我达到的最大值是只更改字符串的前两个字符

   public static String same(String s) {
            String re = "";
            char c = 0;
            char ch = 0;
            for (int i = 0; i < s.length(); i++) {
                c = (char) (s.charAt(0) + 2);
                ch = (char) (s.charAt(1) - 31 * 2);
            }
            String S = new String(new char[] { c, ch });
            re = S+ s.substring(2);


    return re;
    }
公共静态字符串相同(字符串s){
字符串re=“”;
字符c=0;
char ch=0;
对于(int i=0;i

我如何才能使它与所有的string.length()一起工作?

我想知道为什么必须用相同的哈希代码生成两个字符串?不能生成哈希为特定哈希代码的对象。哈希函数是单向函数。散列代码加速对象比较,并将对象映射到特定的散列空间。除非您知道用于计算代码的方法的内部工作原理,否则无法对其进行反向工程,以计算将生成该哈希代码的对象状态。

JavaDocs中描述了字符串中的哈希代码


因此,对于每个字符,您可以将其替换为s[i]*31^(n-i-1)给出相同值的任何字符。

hashcodes的一点是,对于对象的每个相等实例,它应该是相同的。因此,只有两个完全相同的字符串保证为您提供相同的哈希代码。我不知道你想在代码中做什么。请阅读。知道用哪一个来计算散列可能有用。也许我们需要一篇关于如何做出好的评论的文章。;)@Jeroenvanevel我相信OP正在试图找到散列冲突。对OP来说:如果不分析散列算法(可以通过检查java.lang.String的源代码来进行分析),就没有可靠的方法来预测哪个不相等的字符串将产生相同的散列值。可以说的是,假设hashCode值是32位,如果您有超过40亿个不同的字符串,其中一些字符串将不得不产生相同的hashCode值。您可以随时强制执行hash冲突,这似乎是本文的目的。@Lattyware是的,我同意,但是,通常需要多少次迭代来强制执行哈希冲突?(:或者他可以建立一个散列数据库,以后再查,就像人们破解散列密码一样。。。
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]