哈希与多级哈希

最近接触到的项目有用到多级哈希做缓存,趁现在有时间,学习并总结一下哈希方面的知识。

一、哈希。

参考学习资料:

http://www.cnblogs.com/waytofall/archive/2012/06/04/2534386.html

http://www.cnblogs.com/egmkang/archive/2012/01/18/2325474.html

http://blog.sina.com.cn/s/blog_6cf921f301015cuw.html

使用:1.哈希值计算方法。 2 比较与匹配方法。

解决冲突的好方法:

1.开链法,用链表保存冲突值。

2.开放地址法,用桶的概念,每个桶存k个元素。冲突的放在这相邻的元素里。  优点是快(缓冲中相邻地址命中率高),缺点是有可能冲突太多存不了。

STL中的hash_map好像是用方法2实现的。。(使用时一定要构建足够的桶数量。)


二、多级哈希

参考学习资料:

http://ahfuzhang.blogspot.com/2012/09/hash.html

https://software.intel.com/zh-cn/articles/hash

特点:

1.二维数组的方式,每一行的个数都是素数。且数量逐行减少。

2.每个桶只存一个元素,用一维数组来具体实现二维的感觉。

3.冲突处理简单,逐行往下处理。

4.实现简单,扩展性强,当无法插入数据时,只需要继续增加阶数即可。

5.查询快速,空间利用率高。

6. 支持无锁安全高并发。(两个线程在竞争同一个位置时,谁先通过原子操作往里修改标志位并返成功即占有位置,返回失败的往下一层走,不需要锁)

7.当数据插入不了的时候,只能通过增加桶数,同时增加一阶(前面的不变)。

使用:(什么地方经常使用这个表示还不甚明白~~)

1.多级哈希用于需要快速查找、数据多的情况。 比如服务器数据缓存。

2.数据一般是定长的情况。

优化:(导师刚刚指导的,赶紧先记录下来)

1.空间优化。(时间换空间)

一般情况,当N阶都插入失败时,数据不能插入。 

优化方法,每一阶试探时,若插入不进,可以与此阶此位置的数据进行交换,增加命中的机会。

若4级哈希,ABCDE在每一层的哈希值都相同。对应在每一层插入了ABCD,插入E的时候,一般方法是失败。可以变成EBCD,再让A去往其它层存储。

2.时间优化。(空间换时间)

当每一行的元素太多时,上一层与下一层的地址可能相差较大,缓存命中率低,所用时间高

优化方法,每次插入或者匹配时,如果插入或匹配失败,依次管理同一行的后三个元素,地址相差为一,缓存命中高。


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值