散列算法/函数:散列函数使得不同长度的输入消息,产生固定精简长度的输出,这个固定长度的输出称为原输入消息的散列或消息摘要。
不可逆性:由于散列值/哈希值是源数据的信息摘要,而不是压缩,因此无法通过哈希值/散列值找到源数据。
哈希碰撞的产生:
比如说有5个数 12,25,30,45,50,这几个数有个规律,就是十位数都不相同,如果我设置一个散列函数f(value)=value/10;平常的时候,我们查找50,要比较5次(其他算法可能不同),这里用散列算法只需要1次,就是解散列函数,key=50/10=5,要找的数就在第5个位子.
但是上面问题还是很多的,比如说查找55呢?就会出错<因为55解散列函数之后,也是在第5个位子>,还有等等等问题,很显然这个是我散列函数没设置好,当你把散列函数设置好了后,由于数据的庞大,冲突很有可能产生,那么就需要我们来处理冲突了,所以写散列算法就是设置好的散列函数和处理冲突的过程.这里散列算法涉及的查找就跟查找的数量无关,跟冲突率有直接的关系。
java里的哈希表和hashcode:public int hashCode()返回该对象的哈希码值
hashcode:jdk会给每个对象的地址计算出一个hashcode,再将关键字映射到hashcode,这样的话查找元素时直接根据关键字来找到地址对应的hashcode。
我们知道有哈希碰撞存在的可能,那么两个对象的地址经过哈希算法可能对应着相同的hashcode,所以哈希表的唯一性除了先用hashcode比较外还需用equals方法比较内容。
哈希碰撞的解决: