java中hash函数都有什么用啊

java jdk中默认的hash函数是什么~

hash是Object的一个方法 Object.hashCode() ; 返回值是int类型

1、Hash值有什么用?
HashMap、HashTable、HashSet,所以涉及到使用Hash值进行优化存储的地方,都会用到HashCode。HashCode是Key,这种计算为提高计算的性能。想想看,一般来说,数组算是比较快的集合类了吧,直接用index定位元素,简直就是O(1)的级别。但是添加元素就不这么乐观了。但是使用hash类的集合,添加元素,移动的元素少,只影响一小块,并且查找元素,由于hash值已经进行了定位分组,所以也会大大缩小涉及面,快速定位。

2、Hash值应该符合什么原则?
A、等幂性。不管执行多少次获取Hash值的操作,只要对象不变,那么Hash值是固定的。如果第一次取跟第N次取不一样,那就用起来很麻烦,需要记录当前是第几次操作,这种需要记录状态的事情,可不是什么好事。
B、对等性。若两个对象equal方法返回为true,则其hash值也应该是一样的。举例说明:若你将objA作为key存入HashMap中,然后new了一个objB。在你看来objB和objA是一个东西(因为他们equal),但是使用objB到hashMap中却取不出来东西。
C、互异性。若两个对象equal方法返回为false,则其hash值最好也是不同的,但这个不是必须的,只是这样做会提高hash类操作的性能(碰撞几率低)。

3、Hash值应该怎么计算?
A、简单计算就是组成成员的hash值直接相加即可。比如ObjectA有三个属性,propA、propB和propC,最直接的计算方式就是propA.hashcode+propB.hashcode+propC.hashcode。

B、但是如果遇到有顺序相关的怎么办?比如String类型是由char数组组成,并且这些数组是有顺序的。如果使用第一种计算方法,则“ABCD”和“BCDA”就会产生同样的hashCode,那么怎么办呢?最直接想到的办法就是加权,不同的index加不同的权值,这个权值的确定最直接的方法就是某个常数值的几次幂。比如为String的计算hash值为K^0*A.hashCode+K^1*B.hashCode+K^2*C.hashCode+K^3*D.hashCode。K的选择也有说法,最好不要是偶数,因为偶数的相乘会造成信息的丢失(乘以2就是左移1位,一旦溢出就会造成信息的丢失,这种计算会造成溢出后的值与某个看似不相关的数值得到的结果是一样的),所以最好是奇数,在这一点上比较推荐使用7,因为7=8-1=2^3-1,这样计算的时候,直接左移几位再进行一次普通的加减法即可(Java中常用的是31(32-1=2^5-1))。

在Java集合中有两类,一类是List,一类是Set
他们之间的区别就在于List集合中的元素师有序的,且可以重复,而Set集合中元素是无序不可重复的。

对于List好处理,但是对于Set而言我们要如何来保证元素不重复呢?

通过迭代来equals()是否相等。数据量小还可以接受,当我们的数据量大的时候效率可想而知(当然我们可以利用算法进行优化)。

比如我们向HashSet插入1000数据,难道我们真的要迭代1000次,调用1000次equals()方法吗?hashCode提供了解决方案。

怎么实现?我们先看hashCode的源码(Object)。

public native int hashCode(); 它是一个本地方法,它的实现与本地机器有关,这里我们暂且认为他返回的是对象存储的物理位置(实际上不是,这里写是便于理解)。
当我们向一个集合中添加某个元素,集合会首先调用hashCode方法,这样就可以直接定位它所存储的位置,

若该处没有其他元素,则直接保存。
若该处已经有元素存在,就调用equals方法来匹配这两个元素是否相同,
相同则不存,不同则散列到其他位置。

这样处理,当我们存入大量元素时就可以大大减少调用equals()方法的次数,极大地提高了效率。

所以hashCode在上面扮演的角色为寻域(寻找某个对象在集合中区域位置)。

hashCode可以将集合分成若干个区域,每个对象都可以计算出他们的hash码,可以将hash码分组,每个分组对应着某个存储区域,根据一个对象的hash码就可以确定该对象所存储区域,这样就大大减少查询匹配元素的数量,提高了查询效率。

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函数都有什么用啊
答: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个3...

hash函数有哪些
答:hash函数有很多种,包括但不限于MD5、SHA-1、SHA-256、SHA-3等。首先,我们来理解一下hash函数的基本概念。hash函数是一种将任意长度的输入(通常是消息或数据)通过散列算法,变换成固定长度的输出,这个输出就是hash值。hash函数的主要特点是其单向性,即从hash值不能反向推导出原始输入信息,这对于...

什么是哈希函数?业界最常用的hash函数是什么?
答:单向函数,如密码散列函数,是一种看似容易计算但又难以逆向的函数。它们像一把双刃剑,对合法用户而言,计算输出轻而易举,但对于潜在的恶意用户来说,破解却异常困难。在密码学中,RSA、离散对数和ECC等加密技术就依托于单向函数的特性。而MD系列和SHA系列,作为散列函数的代表,更是成为了业界的标准和...

常用的散列函数有哪些
答:return hash;} 2.JS Justin Sobel写的一个位操作的哈希函数。[c-sharp] view plaincopyprint?public long JSHash(String str){ long hash = 1315423911;for(int i = 0; i < str.length(); i++){ hash ^= ((hash << 5) + str.charAt(i) + (hash >> 2));} return hash;} 3....

什么是Hash函数
答:Hash函数是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。Hash函数可以将一个数据转换为一个标志,这个标志和源...

hash函数的构造方法
答:1、直接定址法 取关键字或关键字的某个线性函数值为哈希地址。即:H(key)=key或H(key)=akey+b。其中a和b为常数(这种哈希函数叫做自身函数)。2、数字分析法 假设关键字是以r为基的数(如:以10为基的十进制数),并且哈希表中可能出现的关键字都是事先知道的,则可取关键字的若干数位组成...

java jdk中默认的hash函数是什么
答:hash是Object的一个方法 Object.hashCode() ; 返回值是int类型 1、Hash值有什么用?HashMap、HashTable、HashSet,所以涉及到使用Hash值进行优化存储的地方,都会用到HashCode。HashCode是Key,这种计算为提高计算的性能。想想看,一般来说,数组算是比较快的集合类了吧,直接用index定位元素,简直就是O...

哈希函数的三个性质
答:哈希函数(Hash)自身具有三个特性:①可输入的字符串为任意大小;②产生固定大小(即存储规模)的输出,且这个大小可设定(随机数);③能进行有效计算。在比特币挖矿原理中,随机数是一个指定的解,基于某种率先加密的哈希函数具有单向性和隐秘性,既不能反向解出输入值也无法仅凭尝试找到输入值。此外...

hashmap 中 hash 函数怎么是是实现的?还有哪些 hash 的实现方式_百度知 ...
答:HashMap是对数据结构中哈希表(Hash Table)的实现,Hash表又叫散列表。Hash表是根据关键码Key来访问其对应的值Value的数据结构,它通过一个映射函数把关键码映射到表中一个位置来访问该位置的值,从而加快查找的速度。这个映射函数叫做Hash函数,存放记录的数组叫做Hash表。在Java中,HashMap的内部实现结合...

什么是哈希算法,哈希函数主要有哪些?
答:1.拉链 拉出一个动态链表代替静态顺序储存结构,可以避免哈希函数的冲突,不过缺点就是链表的设计过于麻烦,增加了编程复杂度。此法可以完全避免哈希函数的冲突。2.多哈希法 设计二种甚至多种哈希函数,可以避免冲突,但是冲突几率还是有的,函数设计的越好或越多都可以将几率降到最低(除非人品太差,否则...

IT评价网,数码产品家用电器电子设备等点评来自于网友使用感受交流,不对其内容作任何保证

联系反馈
Copyright© IT评价网