Cuckoo hash算法分析

摘要:
byhaifengli一基本思想:cuckoohash是一种解决hash冲突的方法,其目的是使用简单的hash函数来提高hashtable的利用率,同时保证O的查询时间基本思想是使用2个hash函数来处理碰撞,从而每个key都对应到2个位置。插入操作如下:1.对key值hash,生成两个hashkey值,hashk1和hashk2,如果对应的两个位置上有一个为空,那么直接把key插入即可。cuckoohash的扩展:1、减小hash碰撞一个key对应的hashtable位置处存储多个value,从而以增加查找与插入时间为代价减小hash碰撞。

by haifengli

一 基本思想:

cuckoo hash是一种解决hash冲突的方法,其目的是使用简单的hash 函数来提高hash table的利用率,同时保证O(1)的查询时间

基本思想是使用2个hash函数来处理碰撞,从而每个key都对应到2个位置。

插入操作如下:

1. 对key值hash,生成两个hash key值,hashk1和 hashk2, 如果对应的两个位置上有一个为空,那么直接把key插入即可。

2. 否则,任选一个位置,把key值插入,把已经在那个位置的key值踢出来。

3. 被踢出来的key值,需要重新插入,直到没有key被踢出为止。

查找思路与一般hash一致。

cuckoo hash的扩展:

1、减小hash碰撞

一个key对应的hash table位置处存储多个value(从slot way到 多个 slot way),从而以增加查找与插入时间为代价减小hash碰撞。

做了个实验,比较不同slot way 下 同样装载率(75%)下的碰撞率(hash 函数使用的是cityhash):

slot way Num1248
collision Factors同样条件最大装载率为30%9%3.6%1.1%

表1

注:表1中的”同样条件“是指cuckoo hash中特有的,在hash collision 时的搜索路径的次数一定时。

从图中我们可以看到,在使用cityhash, 1 slot way 时,hash collision 的概率是很高的。

参考链接如下:

http://www.it-c.dk/people/pagh/papers/cuckoo-undergrad.pdf

http://www.it-c.dk/people/pagh/papers/cuckoo-jour.pdf

http://en.wikipedia.org/wiki/Cuckoo_hashing

http://hi.baidu.com/algorithms/blog/item/eb89b582add48f95f703a61e.html

http://blog.csdn.net/suwei19870312/article/details/7442786

免责声明:文章转载自《Cuckoo hash算法分析》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇webpack之代码分离js开启和关闭页面滚动【亲测有效】下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Redis安装配置及使用详解

1. 简介-两个程序通信,除了socket就是文件了,但是通过磁盘效率太低了,之前的RabbitMQ只是实现了消息的传递,现在要是实现数据的共享(一份数据,可供多人查阅),可以通过缓存实现,一个中间商broker。 可是程序之间是无法访问对方的内存地址的。所以其他程序和中间商的之间的通信是通过socket实现的。 2.主流缓存系统 mongodb 直接持...

C++ STL hash表用法

C++ STL unordered_map用法 在C++11中,unordered_map作为一种关联容器,替代了hash_map,unordered_map的底层实现是hash表,所以被称为无序关联容器。不管是map还是unordered_map都是一种 key-map(value) 映射的容器,提供非常高的查找效率,下面我们来了解unordered_m...

HashMap之原理及死锁

一、HashMap原理 1.HashMap的本质就是数组和链表。table是一个entry数组,每一个数组元素保存一个Entry节点,而Entry节点内部又连接着同样key的下一个Entry节点,就构成了链表。. 详情见 HashMap源码分析 2.HashMap死锁原因: HashMap会造成死锁,因为HashMap是线程非安全的,多并发的情况...

由浅入深TheradLocal

线程并发:在多线程并发的场景下 传递数据:我们可以通过ThreadLocal在同一线程,不同组件中传递公共变量 线程隔离:每个线程的变量都是独立的,不会相互影响 常用方法 方法声明 描述 ThreadLocal() 创建ThreadLocal对象 public void set(T value) 设置当前线程绑定的局部变量 public...

从一起“盗币”事件再谈合约安全问题

从一起“盗币”事件再谈合约安全问题 本来是受到从一起“盗币”事件看以太坊存储 hash 碰撞问题一文启发,但是我并不太认同文中的观点.并且文中有一些技术性错误. 一. 起因 今日某安全厂商在以太坊上发布一份让大家来"盗币"的合约,就是希望大家能够意识到不好的合约设计会存在严重安全隐患.下面是这份合约源码. pragma solidity ^0.4.21;...

【原】用Java编写第一个区块链(一)

  写这篇随笔主要是尝试帮助自己了解如何学习区块链技术开发。  【本文禁止任何形式的全文粘贴式转载,本文来自zacky31的随笔】 目标: 创建一个最基本的“区块链” 实现一个简单的挖矿系统 前提: 对面向对象编程有一定的基础 注意: 值得注意的是,这不会是一个完整的功能,恰恰相反,这是一个概念证明的实例,可以帮助您进一步了解区块链。 准备:   我将...