hashtable是一种非常实用的数据结构,尤其数据量相当大的时候,当然其中很关键的一点是hash算法。之前看redis数据库源码它里面实现hash的算法为murmurhash3,后来发现了这个xxhash。它的hash速度要比前者更快,而且散列效果也同样相当出色,当然此算法也有不足之处:64位hash只在64位程序跑很快,而且代码相比前者代码多,所以我基于此hash算法尝试写了一个hashtable。

当前代码实现了创建、查找、添加、删除、获取所有元素、重哈希和自定义比较函数。有引用(key拷贝数据value拷贝指针)拷贝(key拷贝数据value拷贝数据)两种模式可选。自动扩缩容,负载均衡(内部存在两张表,不会扩容rehash导致某单次速度过慢)。C/C++、windows和linux通用,需要说明以下几点:

1. 表起始容量和负载因子默认为hashtable.h内的DEFAULT_CAPACITY和MAX_LOAD_FACTOR(扩容点)、MIN_LOAD_FACTOR(缩容点)宏控制,hash种子默认创建表为time(0)。也可以之后通过htrh接口重新设置

2. 创建时有拷贝和引用两种方式选择(通过枚举enum {REF_MODE = 0, COPY_MODE}设置),拷贝模式会拷贝key和value数据,引用模式会拷贝key数据和value数据指针(外部value数据改变表内数据也会同时改变)。

3. 添加有两个接口htset(成功时返回0,如果key值相同会发生覆盖同时返回1)和htsetnx(成功时返回0,如果key值相同不覆盖同时返回-1)。

4. 获取所有元素也分拷贝和引用两种模式,都返回一个元素指针数组。前者指针指向复制数据,后者指向表内数据。两者都有内部内存申请。

5. 可以通过ht_set_compare_func设置自定义键值比较方法,默认为memcmp。

6. 扩容方面我参考了redis哈希表的扩容思想,内部存在两个表,扩容时不会一次将所有数据重新拷贝,而是每次逐元素拷贝,平摊效率以追求更好的负载均衡。

所有功能都有简单的测试代码,DEBUG模式有单次速度统计和结果校验,性能测试(8起始容量0.75/0.15负载因子)随机选取一百万条16字节key和16字节value分别连续插入、查询、获取所有元素、重哈希和删除(代码都可自由设置,详细请看test_hash.c内代码)。下面是性能测试结果仅供参考(电脑配置i5-3470 3.20 GHz Linux64位):

DEBUG模式

RELEASE模式

上面结果由于随机数据和不同hash种子可能略有波动。打开debug模式(打开test_hash.c内DEBUG宏或make sample_d)会有10%-20%的性能损失。

然后我这里实现的扩缩容的策略为每次扩大(缩小)一倍,摊还分析插入n个元素时间复杂度应为1+...(n个1)...+1+1+2+4+8...n(假设n是2的幂次方),其和为3n,所以为线性时间,而且由于将每次扩容后元素转移分摊到每次增删查中,因此可以得到更好的负载均衡。

最后我翻译个(谷歌翻译..)xxhash网站说明供大家看下:

xxHash是一种非常快速的非加密散列算法,其工作速度接近RAM限制。它有两种版本,32位和64位。

该基准测试使用Austin Appleby的开源SMHasher程序,在Windows 7 32位单线程模式下使用Visual C编译。 参考系统使用Core 2 Duo @ 3.0GHz

NameSpeedQualityAuthor

xxHash

5.4 GB/s

10

Y.C.

MurmurHash 3a

2.7 GB/s

10

Austin Appleby

SBox

1.4 GB/s

9

Bret Mulvey

Lookup3

1.2 GB/s

9

Bob Jenkins

CityHash64

1.05 GB/s

10

Pike & Alakuijala

FNV

0.55 GB/s

5

Fowler, Noll, Vo

CRC32

0.43 GB/s

9

MD5-32

0.33 GB/s

10

Ronald L.Rivest

SHA1-32

0.28 GB/s

10

Q.Score是散列函数质量的度量。 这取决于成功通过SMHasher测试集。 10是一个完美的分数。 分数<5的算法未在此表中列出。

由于Mathias Westerdahl的贡献,创建了新版本XXH64,该版本为64位系统提供了卓越的速度和分散性。 但请注意,使用32位版本,32位应用程序的运行速度仍将更快。

在Linux Mint 64位上使用GCC 4.8.2编译的SMHasher速度测试。 参考系统使用Core i5-3340M @ 2.7GHz

VersionSpeed on 64-bitsSpeed on 32-bits

XXH64

13.8 GB/s

1.9 GB/s

XXH32

6.8 GB/s

6.0 GB/s

散列表删除一个元素c语言,分享一个简单高效的哈希表C语言实现相关推荐

  1. 常用的xpath定位,通过一个元素去定位另一个元素,基本上能解决工作中所有定位

    前言 今天和大家分享几个工作中经常使用的xpath定位,基本上能解决工作中所有定位. 一.输入框类 1.有提示信息的,例如:placeholder="请输入用户名",则可以通过相应 ...

  2. 编写程序,生成一种贯穿10*10字符数组(初始时全为字符'.')的“随机步法”。程序必须随机地从一个元素“走到”另一个元素,每次都向上、向下、向左或向右移动一个元素位置

    编写程序,生成一种贯穿10*10字符数组(初始时全为字符'.')的"随机步法".程序必须随机地从一个元素"走到"另一个元素,每次都向上.向下.向左或向右移动一个 ...

  3. 语言都是相通的,学好一门语言,再学第二门语言就很简单,记录一下我复习c语言的过程。...

    语言都是相通的,学好一门语言,再学第二门语言就很简单,记录一下我复习c语言的过程. 为了将本人的python培训提高一个层次,本人最近买了很多算法的书. 这个书上的代码基本都是c语言实现的,c语言很久 ...

  4. 如何恢复手动删除的微信聊天记录?2个简单高效方法推荐

    对于没有备份的微信聊天记录并且删除掉了,有什么办法可以恢复回来吗?如何恢复手动删除的微信聊天记录?微信作为如今使用量最多的通讯软件,而且现在的手机都是触屏手机,一不小心滑动屏幕就会把聊天窗口删除,小编 ...

  5. 19 | 散列表(中):如何打造一个工业级水平的散列表?

    问题引入:如何实现一个工业级的散列表? 主要要求: 设计一个合适的散列函数: 定义装载因子阈值,并且设计动态扩容策略: 选择合适的散列冲突解决方法. 对于动态散列表来说,不管我们如何设计散列函数,选择 ...

  6. mysql数据库新建一个递增的_分享一个mysql实验—基于数据库事务隔离级别RR及RC的测试...

    概述 今天主要分享一个最近做的实验,主要是测试mysql数据库在RR和RC不同事务隔离级别下的表现. MySQL使用可重复读来作为默认隔离级别的主要原因是语句级的Binlog.RR能提供SQL语句的写 ...

  7. c++ 哈希表_C语言精华知识:表驱动法编程实践

    问:怎么每天看到这种文章? 答:只需搜索公众号"51单片机学习网"免费关注 排版:嵌入式云IOT技术圈 数据压倒一切.如果选择了正确的数据结构并把一切组织的井井有条,正确的算法就不 ...

  8. 【LeetCode笔记】169. 多数元素(Java、摩尔投票法、哈希表)

    文章目录 题目描述 思路 & 代码 思路一:哈希表 思路二: 摩尔投票法 题目描述 好家伙,这是今天最有意思的题目了 思路 & 代码 思路一:哈希表 先说缺点:空间复杂度O(n) 一次 ...

  9. erase() 返回的是删除此元素之后的下一个元素的迭代器 .xml

    比如: 我写的一个程序中,要删除某个位置的元素 for(list<list<tag_Point>>::iterator pos=point_to_file_list.begin ...

最新文章

  1. 【亲测有效】如何下载和安装Resilio BTSync
  2. 史上最具体Android集成QQ,微信,微博分享(不用第三方)持续更新中
  3. python数据挖掘例题_数据挖掘与python实践试题及答案
  4. 分布式机构 RPC远程过程调用
  5. mysql在cmd命令行下的相关操作
  6. api自动化_如何在不增加人员的情况下自动化API安全程序
  7. java手动回收_浅谈java是如何做资源回收补救的
  8. 转载-聊一聊深度学习的activation function
  9. web中“/”写在不同地方时的值不同
  10. 蓝桥杯 ADV-100 算法提高 第二大整数
  11. LayaAir UI 组件 # Clip 切片、ComboBox 下拉框
  12. 即时通讯源码|IM即时通讯源码开源
  13. 系统监视器(Sysmon)工具的使用
  14. 计算机课做名片怎么做,第7课制作个人小名片(教学设计)
  15. win7c盘空间越来越小_C盘空间越来越小怎么办,5个步骤无损扩容1招就搞定
  16. vendor分区的库无法调用system分区的库
  17. 大学物理第二章笔记——高等农林院校基础课程教程系列
  18. 使用js修改图片像素颜色并保存
  19. 分布式系统基础--CAP理论
  20. el vue 手机号_Vue 正则表达式验证邮箱和手机号码

热门文章

  1. 守得云开见月明:一次ASM存储高可用故障解决过程分析
  2. 6种常见的地标识别算法整理和总结
  3. 【华为云技术分享】一文掌握5种常用的机器学习模型及其优缺点
  4. AI本质就是“暴力计算”?看华为云如何应对算力挑战
  5. android studio moudel,Android Studio将module变为library
  6. href up test.php,test.php
  7. linux一切皆是文件_Linux 的虚拟文件系统(真正理解“一切皆文件”)
  8. Kafka和的安装与配置
  9. Head First设计模式读书笔记三 装饰模式(个人理解:包装模式)
  10. The tempotron: a neuron that learns spike timing–based decisions 事件驱动