散列表⽤的是数组⽀持按照下标随机访问数据的特性,所以散列表其 实就是数组的⼀种扩展,由数组演化⽽来。可以说,如果没有数组,就没有散列表。
Hash(key)
数据量比较小、装载因子小的时候,适合采用开放定址法
基于链表的散列冲突处理⽅法⽐较适合存储⼤对 象、⼤数据量的散列表,⽽且,⽐起开放寻址法,它更加灵活,⽀持 更多的优化策略,⽐如⽤红⿊树代替链表
需要的操作:
解决方案:
需要的操作:
解决方案:
LinkedHashMap是通过双向链表和 散列表这两种数据结构组合实现的。LinkedHashMap中 的“Linked”实际上是指的是双向链表,并⾮指⽤链表法解决散列冲突
将任意⻓度的⼆进制值串映射为固定⻓度的⼆进制值串,这个映射的规则就是哈希算法,⽽通过原始数据映射之后得到的⼆进制值串就是哈希值
发生脱库解决方案:
获取数据固定片段(如前100、中100、后100字节)进行哈希算法,根据哈希值再进行判断可以节省大量计算。
基于P2P协议文件下载,将一个文件分为多个文件块,可以对每个文件块进行哈希算法,保证数据安全。
保证哈希冲突小,出现冲突时,使用开放定址法、拉链法解决冲突。
保证会话粘滞(Session sticky),需要在同⼀个客户端上,在⼀次会话中的所有请求都 路由到同⼀个服务器上。
可以通过 哈希算法,对客户端IP地址或者会话ID计算哈希值,将取得的哈希值 与服务器列表的⼤⼩进⾏取模运算,最终得到的值就是应该被路由到 的服务器编号。
两个例子
以先对数据进⾏分⽚,然后采⽤多台机器处 理的⽅法,来提⾼处理速度;
为了提⾼处理的速 度,我们⽤n台机器并⾏处理。我们从搜索记录的⽇志⽂件中,依次读 出每个搜索关键词,并且通过哈希函数计算哈希值,然后再跟n取模, 最终得到的值,就是应该被分配到的机器编号。
同样可以对数据进⾏分⽚,然后采⽤多机处理。我们准备n台机 器,让每台机器只维护某⼀部分图⽚对应的散列表。我们每次从图库 中读取⼀个图⽚,计算唯⼀标识,然后与机器个数n求余取模,得到的 值就对应要分配的机器编号,然后将这个图⽚的唯⼀标识和图⽚路径 发往对应的机器构建散列表;
当要判断⼀个图⽚是否在图库中的时候,我们通过同样的哈希算 法,计算这个图⽚的唯⼀标识,然后与机器个数n求余取模。假设得到 的值是k,那就去编号k的机器构建的散列表中查找。
问题原因:
但是,如果数据增多,原来的10个机器已经⽆法承受了,我们就需要 扩容了,⽐如扩到11个机器,这时候⿇烦就来了;
原来的数据是通过与10来取模的。⽐如13这个数据,存储在编号为3 这台机器上。但是新加了⼀台机器中,我们对数据按照11取模,原来13这个数据就被分配到2号这台机器上了。
解决方案:⼀致性哈希算法