美文网首页
Hashcode相同但是equals不同的例子

Hashcode相同但是equals不同的例子

作者: 马木木 | 来源:发表于2018-03-06 16:50 被阅读0次

    大家都知道equals()相同时 hashcode 必须相同 但是hashcode相同并不一定eqauls
    但是具体的例子还真没看过
    我们可以看到String 的 hashcode()方法如下

    public int hashCode() {
            int var1 = this.hash;
            if (var1 == 0 && this.value.length > 0) {
                char[] var2 = this.value;
    
                for(int var3 = 0; var3 < this.value.length; ++var3) {
                    var1 = 31 * var1 + var2[var3];
                }
    
                this.hash = var1;
            }
    
            return var1;
        }
    

    这里我用我的姓的拼音来演示下 马(Ma)
    在Ascii表中我们可以找到 Ma和编码分别是 77 66
    这样算的就是(31*0+77)*31+66
    数据有点少看不出来规律 再加上我的名 林(Lin) 76 69 110
    这样算起来就是

    ((((31*0+77)*31+66)*31+76)*31+69)*31+110
    

    这样我们就可以总结出来规律啦

    31*31(n-1)+str.charAt(0)*31(n-2)+str.charAt(1)*31(n-3)+...+str.charAt(n-1)
    

    其中的(n-*)代表根次方

    这样我们就可以看出来了 如果构造相邻俩个最后的和一样
    我们设比较的两个字符串的编码形式为 (x1)(y1)(x2)(y2)
    他们俩只有中间俩个字符的编码不一样 那么怎么分别设置这两个字符串才能让他们的编码最后相同呢
    经过一番高考之前的我附身 我们可以得到以下的等式

    image

    掘金和简书竟然都不支持公式……

    最最重要的是

    (x1-x2)*31=(y2-y1)
    

    也就是相邻的两位如果前边的编码差 1 后边的两个的编码就要差 -31*1

    俩个实例吧 还是上边的我的大姓 Ma
    有哪个字符串是和 M(77)a(97) Hashcode相同的呢
    其中一个结果竟然为 NB(敲黑板) N(78)B(66) 看起来我们这个姓比较厉害了

    相关文章

      网友评论

          本文标题:Hashcode相同但是equals不同的例子

          本文链接:https://www.haomeiwen.com/subject/rsrrfftx.html