对象的 hashCode() 方法,为对象返回一个 哈希值。那什么是 哈希值 ?
这个词的解释有很多。
哈希值是数据的摘要。(什么是摘要?看电影的时候都看过剧情简介吧?这就是摘要。比如你大致听完一段介绍,你就可以判断这部电影你看过没有。)我觉得用摘要很形象。我看到这个词时一下明白了哈希的作用。
哈希值是将任意长度的数据映射到有限长度的域上。直观解释起来,就是对一串数据m进行杂糅,输出另一段固定长度的数据h,作为这段数据的特征(指纹)。
将一定长度的数据进行有损压缩,就能得到固定长度的哈希值,这个哈希值保留了原数据的一部分信息,把这种压缩算法称之为哈希算法。
既然说哈希值是数据的摘要,那么要尽可能保证这个摘要的准确性,相似的数据他们的哈希值要尽量不同。所以哈希算法有两个要求:
抗碰撞能力:对于任意两个不同的数据块,其hash值相同的可能性极小;对于一个给定的数据块,找到和它hash值相同的数据块极为困难。
抗篡改能力:对于一个数据块,哪怕只改动其一个比特位,其hash值的改动也会非常大。
那么数据和哈希有什么样的对应关系呢?
根据哈希值1可以知道元数据 要么是 数据1 要么是 数据2,但是反过来,相同的数据必定得到相等的哈希。
理解了哈希的概念,在来理解对象的哈希值,对象其实是对数据的封装,如果两个对象封装的数据相同(即equals=true)那么他们应该具有相等的哈希值。如果两个对象封装的数据不同(equlas=false)那么他们可以具有相同的哈希值。但是为了哈希的抗碰撞能力,实现时应尽量保证他们的不等。