黑马程序员技术交流社区

标题: 哈希值问题 [打印本页]

作者: 张榆    时间: 2012-9-8 00:51
标题: 哈希值问题
问问,相同的字符串可能会有不同的HashCode吗?相同的字符串每次生成的HashCode都相同吗?



作者: 冯心程    时间: 2012-9-8 01:36
相同的字符串的hashcode必然相同 因为都是用hash算法算的嘛


hashcode是由Hash算法得出来的,根据字符串的值算出来的,每次算出来的结果都相同

1.jpg (31.06 KB, 下载次数: 56)

1.jpg

作者: 郑义    时间: 2012-9-8 07:16
分析相同两个字符串对象的HashCode是不是相同,应该看看String类中复习的hashCode()方法
根据API:
public int hashCode()返回此字符串的哈希码。String 对象的哈希码根据以下公式计算:
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
使用 int 算法,这里 s 是字符串的第 i 个字符,n 是字符串的长度,^ 表示求幂。(空字符串的哈希值为 0。)

发现,你的两个字符串对象转换成字符数组之后,其数组中的每个元素都是相同的。
根据上边的计算公式可知,两个相同字符串的HashCod是相同的。


作者: 邱成    时间: 2012-9-8 07:47
1相同的字符串可能会有不同的HashCode吗?
如果你自己重写equals和hashcode方法是可以实现的,但是java规范要求两个equals的对象一定要有相同的hashcode

2.相同的字符串每次生成的HashCode都相同吗?
你的实现可以不同,但是java规范要求对于同一个对象每次生成的hashcode必须相同!

具体可参照API的Object中的equals方法和hashCode方法
     public int hashCode() {
int h = hash;
if (h == 0) {
     int off = offset;
     char val[] = value;
     int len = count;

            for (int i = 0; i < len; i++) {
                h = 31*h + val[off++];
            }
            hash = h;
        }
        return h;
    }
这个算发绝对不会算出两个结果的。      
作者: 夏天    时间: 2012-9-11 11:15
楼上正解。。{:soso_e113:}
作者: 夏天    时间: 2012-9-11 11:16
另外,版主对这个问题的评论很到位 {:soso_e113:}




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2