Hash算法只是一个定义,并没有规定具体的实现

简述

把任意长度的输入,通过Hash算法变换成固定长度的输出,这个输出就是Hash值。哈希值的空间远小于输入的空间,所以可能会发生“哈希碰撞”,即两个不同的输入,产生了同一个输出。Hash算法常用于消息摘要的场景 MD5、SHA都属于Hash算法的实现。

简单使用

凡是涉及到分布式的系统,就会有负载均衡和数据分布的问题。为了让连接(或者数据)能够分布得更均匀,很多时候会使用到Hash算法

  • Hash取模 (hash(request) % n)
    假设我们现在有3个服务器,想要做负载均衡,就可以对请求的ip地址或者用户的id等使用Hash函数,然后将计算得出的Hash值对3取模,余数为几,就把请求分配到相应的服务器上
    缺点:如果新增服务器的时候,绝大多数请求基本上都需要重新映射到另一个节点。这种变动有时候是不能接受的。比如在Web负载均衡的场景下,session会保存在每个节点里。当然,如果你是“无状态”的服务,那不会存在这个问题。因为如果增加或者删除了一个节点,就会导致几乎所有的数据都需要重新迁移。
  • 一致性Hash
    优点:解决因为横向伸缩导致的大规模数据变动
    上面说到用节点的数量作为除数去求余。而一致性Hash的除数是232。从0到232 - 1,首尾相连构成了一个环。我们先对服务器节点的IP进行Hash,然后除以2^32
    得到服务器节点在这个Hash环中的位置。如果有请求进来了,同样进行Hash然后处于2^32求余。如果落在Hash环上,然后顺时针找到第一个节点,这个节点就负责处理这个请求。一致性Hash算法在节点数量较少的时候,会出现分布不均匀的问题
    。解决这个问题的方案就是在Hash环上增加虚拟节点

哈希表简介

非哈希表的特点:关键字在表中的位置和它之间不存在一个确定的关系,查找的过程为给定值一次和各个关键字进行比较,查找的效率取决于和给定值进行比较的次数。
哈希表的特点:关键字在表中位置和它之间存在一种确定的关系。
哈希函数:一般情况下,需要在关键字与它在表中的存储位置之间建立一个函数关系,以f(key)作为关键字为key的记录在表中的位置,通常称这个函数f(key)为哈希函数。
hash :翻译为“散列”,就是把任意长度的输入,通过散列算法,变成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到莫伊固定长度的消息摘要的函数。
hash冲突:就是根据key即经过一个函数f(key)得到的结果的作为地址去存放当前的key value键值对(这个是hashmap的存值方式),但是却发现算出来的地址上已经有人先来了。这就是所谓的hash冲突啦

哈希函数处理冲突的方法

开放定址法:


其中 m 为表的长度
对增量di有三种取法
1:线性探测再散列 di = 1 , 2 , 3 , … , m-1
2:平方探测再散列 di = 1 , -1 , 2, -2 , 3 , -3 , … , k , -k(取相应数的平方)
3: 随机探测再散列 di 是一组伪随机数列
例子:

链地址法


先按照以上的hash算法:h(key) = key % 7,算出来对应的hash值,这个hash值暂时就决定,当前的这个值,存放在数组的位置。

这个做法就是Java的HashMap就是这么实现的,简单的解释下,这个HashMap源码的这个链表产生机制。
在put()方法里面,最后部分有个如下的调用。
addEntry(hash, key, value, i);
解释下几个参数的意思:

1,hash:就是根据key算出来的一个值,源码是这么滴–int hash = hash(key);,
2,key:key就是我们在往hashmap里面put键值对的时候的key
3,value:这个同上啦,就是存的键值对的值。
4,i:源码里面是这么滴–int i = indexFor(hash, table.length);实际意思就是这个键值对存放在底层数组的索引下标。然后这个i,可以对应到ppt上的那个取模之后的值,也就是确定在数组上的下标。
虽然在put的时候,可能会出现扩容的问题,但是在这咱就不考虑这个,只考虑如何生成链表,以及链表上的键值对的顺序。
createEntry(hash, key, value, bucketIndex);
这个方法就是真正的在创建一个节点到数组上。

再哈希、建立公共溢出区


建立一个公共溢出区域,就是把冲突的都放在另一个地方,不在表里面。

总结一下的就是下面的四行字:

1.开放定址法(线性探测再散列,二次探测再散列,伪随机探测再散列)
2.再哈希法
3.链地址法(Java hashmap就是这么做的)
4.建立一个公共溢出区

解决Hash冲突四种方法相关推荐

  1. HashMap解决Hash冲突为什么要使用红黑树

    1.HashMap的数据结构 HashMap是由数组与链表来实现的,同时,也具备了数组和链表的所以特点 2.什么是hash冲突 hash冲突:就是根据key即经过一个哈希变换得到的结果的作为地址去存放 ...

  2. Hash算法解决冲突的四种方法

    Hash算法解决冲突的四种方法 参考文章: (1)Hash算法解决冲突的四种方法 (2)https://www.cnblogs.com/lyfstorm/p/11044468.html 备忘一下.

  3. Java解决Hash(散列)冲突的四种方法--开放地址法(线性探测,二次探测,伪随机探测)、链地址法、再哈希、建立公共溢出区

    Java解决Hash(散列)冲突的四种方法--开放地址法(线性探测,二次探测,伪随机探测).链地址法.再哈希.建立公共溢出区 参考文章: (1)Java解决Hash(散列)冲突的四种方法--开放地址法 ...

  4. 哈希冲突四种解决方法

    哈希冲突的产生原因 哈希是通过对数据进行再压缩,提高效率的一种解决方法.但由于通过哈希函数产生的哈希值是有限的,而数据可能比较多,导致经过哈希函数处理后仍然有不同的数据对应相同的值.这时候就产生了哈希 ...

  5. HashMap解决hash冲突的方法

    HashMap解决hash冲突的方法 博客分类: jvm虚拟机 在Java编程语言中,最基本的结构就是两种,一种是数组,一种是模拟指针(引用),所有的数据结构都可以用这两个基本结构构造,HashMap ...

  6. 四种方法解决最大连续子序列和问题

    四种方法解决最大连续子序列和问题 参考文章: (1)四种方法解决最大连续子序列和问题 (2)https://www.cnblogs.com/AlvinZH/p/6795647.html 备忘一下.

  7. 四种方法解决DIV高度自适应问题

    四种方法解决DIV高度自适应问题 参考文章: (1)四种方法解决DIV高度自适应问题 (2)https://www.cnblogs.com/smght/p/4505614.html 备忘一下.

  8. 解决hash冲突的三个方法

    解决hash冲突的三个方法 参考文章: (1)解决hash冲突的三个方法 (2)https://www.cnblogs.com/wuchaodzxx/p/7396599.html 备忘一下.

  9. 解决声卡爆音/杂音的四种方法

       内容提要:解决声卡爆音/杂音的四种方法,放MP3和电影的时候,总是会出现"噼噼啪啪"的声音,电脑播放任何音频时都会有爆音的情况出现.电脑采用了英特尔酷睿II E4500的处理 ...

  10. Android电视kodi安装失败,电视提示“解析包出现错误” ?四种方法教你轻松解决...

    原标题:电视提示"解析包出现错误" ?四种方法教你轻松解决 日常生活中,我们经常会遇到智能电视提示:解析包时出现错误.遇到这样的问题,不要抓狂,小智教你轻松解决. 首先,我们要清楚 ...

最新文章

  1. LoadRunner做性能测试 从设计到分析执行
  2. python学习笔记 -- reduce合并减少
  3. android 马甲包 app,寻 实力android马甲包上架技术
  4. Effective Java之接口优先于反射机制(五十三)
  5. java.util.zip.zipexception_android-如何解决java.util.zip.ZipException?
  6. 写给程序员的秘籍:你跟优秀程序员的差距,其实就在这几个方面!
  7. Golang string处理
  8. 【BZOJ】1690: [Usaco2007 Dec]奶牛的旅行
  9. iconfont-阿里巴巴矢量图标库使用教程
  10. Unity草地/草坪案例分享(完整代码)
  11. js 的常用工具类库
  12. android系统目录哪些不能删除,手机系统文件中的以下文件是不能删除
  13. Unity导入模型贴贴图一面有贴图另一面透明的解决方法
  14. 在xp系统电脑上建立宽带连接服务器吗,windows xp系统如何在电脑桌面上创建ADSL连接...
  15. leetcode 思路——64. 最小路径和——174. 地下城游戏
  16. 关于socket-error-10054的一点认知
  17. citra黑屏_3ds模拟器最新版Citra下载_3ds模拟器Citra2019最新版下载_游戏堡
  18. 蓝桥杯真题:三羊献瑞
  19. 【Java】方法中的参数传递机制的具体体现
  20. 记:为何我设置了session为永久保存,但是并没有什么卵用

热门文章

  1. 连接linux工具Mtr,Linux/Windows MTR工具检测服务器性能详细方法
  2. cmd imp导入dmp文件_在cmd中怎么样导入dmp文件?
  3. Matlab:实现高斯光束产生
  4. Android--扫一扫(识别二维码、条码)
  5. Android oem 解锁
  6. Netty权威指南2.1BIO通信Demo代码
  7. css城市列表,js 获取全国城市列表方法
  8. python函数分为哪几种_python函数有哪几种
  9. MOTU Digital Performer 11.0 WiN 老牌音乐制作宿主软件
  10. matlab 的滤波器分析,基于MATLAB仿真软件对有源滤波器进行分析研究