关于java的哈希值

Python06

关于java的哈希值,第1张

HASH

是散列表的基础计算方法,Java

内置了

hash

的支持,java.lang.Object

默认是通过对象在内存的地址计算出来的,所以每个对方都是唯一的

hash,但是当我们创建我们自己的对象类时,我们根据需要和业务逻辑来决定是否提供自己的

hashcode

equals

方法。

多个对象的

hash

可能重复,这是正常的,重复的对象在

hash

table

中是分配在同一个槽

(一个可以通过计算直接跳过那个位置的数组)中,会再通过

equals

对比

(在这个槽中的

hash

code

都相同的一个链表中逐一

equals

比较

key)

找到那个对象。

所以逻辑上是否相同是通过

equals

来计算的,而且

equals

相同的两个对象,它们的

hash

也应该相同,如果你不能保证这点,那就说明你的

hashcode

equals

方法不是使用相同的算法

一个对象是否存在不是通过

hash

code

来判断的,而是

equals。

a

==

b

的话,a.equals

(b)

肯定成立,但反过来就不一定。因为

a

==

b

比较的是对象的地址,只有同一个对象才能成立,equals

比较的是逻辑角度上的相等性。

String

或其它一个

JRE

自带的类的

hashcode

equals

方法是怎么做到的。

Hash,一般翻译做"散列",也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。

简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。

HASH主要用于信息安全领域中加密算法,他把一些不同长度的信息转化成杂乱的128位的编码里,叫做HASH值. 也可以说,hash就是找到一种数据内容和数据存放地址之间的映射关系

了解了hash基本定义,就不能不提到一些著名的hash算法,MD5 和 SHA1 可以说是目前应用最广泛的Hash算法,而它们都是以 MD4 为基础设计的。那么他们都是什么意思呢?

这里简单说一下:

1) MD4

MD4(RFC 1320)是 MIT 的 Ronald L. Rivest 在 1990 年设计的,MD 是 Message Digest 的缩写。它适用在32位字长的处理器上用高速软件实现--它是基于 32 位操作数的位操作来实现的。

2) MD5

MD5(RFC 1321)是 Rivest 于1991年对MD4的改进版本。它对输入仍以512位分组,其输出是4个32位字的级联,与 MD4 相同。MD5比MD4来得复杂,并且速度较之要慢一点,但更安全,在抗分析和抗差分方面表现更好

3) SHA1 及其他

SHA1是由NIST NSA设计为同DSA一起使用的,它对长度小于264的输入,产生长度为160bit的散列值,因此抗穷举(brute-force)性更好。SHA-1 设计时基于和MD4相同原理,并且模仿了该算法。

哈希其实只是一个概念,没有什么真实的指向。它的目的是保证数据均匀的分布到一定的范围内。所以不同数据产生相同的哈希码是完全可以的。

java中哈希一般是希望自己写算法的。随便返回什么都可以。如果什么也不写的话就会返回地址。如果自己写,最简单的做法是把所有字段拼起一个长串做个hash值。