什么是哈希,哈希表,哈希函数,哈希碰撞?

什么是哈希?

比方我有个原始值,S=[“老铁双击666”,‘感谢老铁送的飞机’],
通过某种算法(比如java的hasecode(获得变量的物理地址))得到的666这个就是“哈希码“(将字符串转换成尽可能不重复的int类型数字),
然后通过“哈希算法“(如取余法等)获得的值比如1, 这个1就是“哈希值“,存储“1对应老铁双击666“这些关系的就是哈希表。

说明一下:上面的取余运算是666%N,N在下图的意思中是3,正常是count(S)/5,太长会产生很多空项,太短很多值会很长变成链式搜索

什么是哈希冲突?

1.拉链法:

什么是哈希,哈希表,哈希函数,哈希碰撞?_第1张图片
上图为什么1位置后面有两个数据呢?因为其他值经过哈希运算后拿到的哈希值也可能是1,这就是哈希冲突(哈希碰撞),解决方法有很多,链地址法适用于经常进行插入和删除的情况。

2.开放地址法:

开放地址法又分线性探测法和双重哈西法

线性探测法
(图为线性探测法)

线性探测法

假设元素29哈希运算后还是29
插入元素29:元素29的哈希值为29,29%14=1,但1号元素已经有数值15了,然后检查下一个元素(2号元素),但2号元素已经有数值30了,然后检查下一个元素(3号元素),3号元素为空,插入到3号元素
搜索元素29:元素29的哈希值为29,29%14=1,检查1号元素,15!=29;然后检查下一个元素(2号元素),30!=29;然后检查下一个元素(3号元素),29=29,返回数值,查找完毕。

双重哈西法

又称再哈西法,再原来哈西函数的基础上再准备一个哈西函数2,如地址冲突,运行函数2,如又冲突,则函数2得到的值加一,再加二直到不在冲突。

总结

hash table哈希表是基于数组的一种存储方式,其存储上就是用于存储键值对()的集合(数组)。当要存储一个数据的时候,首先用一个函数计算 数据的地址,然后再将数据存进指定地址位置的数组里面。这个函数就是哈希函数,而这个数组就是哈希表,哈希的主要应用是哈希表和分布式缓存


注:自己的理解归纳,有错误敬请留言指正。

你可能感兴趣的:(其他,哈希,哈希算法)