JAVA中的Hash码的生成及作用

147 阅读2分钟

Hash算法的原理

Hash算法是一种将任意长度的输入数据转换为固定长度的输出数据的数学函数。如java中的Object默认hash函数就是取对象的内存地址,然后将其通过默认的hash运算将其在内存中的地址通过hash运算映射至2322^{32}大小的空间

image.png

其数学原理基于哈希函数的设计原则,保证输入的每个不同的数据都能映射到哈希值的不同值.从而实现数据的宽分布。以下是Hash算法的特性:

  1. 均匀分布性:散列函数输出的HASH值应该在整个输出空间内尽可能均匀地分布。为了达成这一点,散列函数通常会通过某些数学变换,将输入数据映射到一个巨大的散列空间内。这种变换包括模运算、位运算以及多项式运算等。
  2. 高度的随机性:确保对于任意输入,其散列值在整个可能的HASH值域中分布得足够随机,几乎不可能找到任何规律将散列值反推回原始输入。
  3. 不可逆性:从HASH值不应能够推导出原始输入信息。即哈希函数是不可逆的,无法从哈希值恢复原始数据。
  4. 快速计算性:哈希函数的计算应该足够快,适合在各种场景中高效使用。
  5. 雪崩效应:当输入信息发生一点微小变化(哪怕只是1位的变化),通过HASH函数处理后,输出的散列值将产生极大的不同。这一特性对HASH算法来说极其重要,因为它能够防止HASH碰撞的发生。

JAVA常见的对象类型计算哈希码的方式

  • Object 类的默认 hashCode :返回对象的内存地址经过处理后的结构,由于每个对象的内存地址都不一样,所以哈希码也不一样。
  • String 类的 hashCode :根据 String 类包含的字符串的内容,通过一种特殊算法返回哈希码,只要字符串所在的堆空间相同,返回的哈希码也相同。
  • Integer 类:返回的哈希码就是 Integer 对象里所包含的那个整数的数值,例如 Integer i = new Integer(100) , i.hashCode() 的值就是 100。

HashMap对于Hash运算的运用

待补充