字符串Hash函数评估
来源:互联网 发布:淘宝卖鲜活生产许可证 编辑:程序博客网 时间:2024/05/16 10:23
Hash查找因为其O(1)的查找性能而著称,被对查找性能要求高的应用所广泛采用。它的基本思想是:
(1) 创建一个定长的线性Hash表,一般可以初始化时指定length;
(2) 设计Hash函数,将关键字key散射到Hash表中。其中hash函数设计是最为关键的,均匀分布、冲突概率小全在它;
(3) 通常采用拉链方法来解决hash冲突问题,即散射到同一个hash表项的关键字,以链表形式来表示(也称为桶backet);
(4) 给定关键字key,就可以在O(1) + O(m)的时间复杂度内定位到目标。其中,m为拉链长度,即桶深。
Hash应用中,字符串是最为常见的关键字,应用非常普通,现在的程序设计语言中基本上都提供了字符串hash表的支持。字符串hash函数非常多,常见的主要有Simple_hash, RS_hash, JS_hash, PJW_hash, ELF_hash, BKDR_hash, SDBM_hash, DJB_hash, AP_hash, CRC_hash等。它们的C语言实现见后面附录代码: hash.h, hash.c。那么这么些字符串hash函数,谁好熟非呢?评估hash函数优劣的基准主要有以下两个指标:
(1) 散列分布性
即桶的使用率backet_usage = (已使用桶数) / (总的桶数),这个比例越高,说明分布性良好,是好的hash设计。
(2) 平均桶长
即avg_backet_len,所有已使用桶的平均长度。理想状态下这个值应该=1,越小说明冲突发生地越少,是好的hash设计。
hash函数计算一般都非常简洁,因此在耗费计算时间复杂性方面判别甚微,这里不作对比。
评估方案设计是这样的:
(1) 以200M的视频文件作为输入源,以4KB的块为大小计算MD5值,并以此作为hash关键字;
(2) 分别应用上面提到的各种字符串hash函数,进行hash散列模拟;
(3) 统计结果,用散列分布性和平均桶长两个指标进行评估分析。
测试程序见附录代码hashtest.c,测试结果如下表所示。从这个结果我们也可以看出,这些字符串hash函数真是不相仲伯,难以决出高低,所以实际应用中可以根据喜好选择。当然,最好实际测试一下,毕竟应用特点不大相同。其他几组测试结果也类似,这里不再给出。
附录源代码:
hash.h
hash.c
hashtest.c
- 字符串Hash函数评估
- 字符串Hash函数评估
- 字符串Hash函数评估
- 字符串Hash函数评估
- 字符串Hash:各种字符串Hash函数比较
- 字符串hash函数
- 字符串hash函数
- 经典字符串Hash函数
- 经典字符串Hash函数
- 字符串hash函数
- 各种字符串Hash函数
- 字符串Hash函数对比
- 各种字符串HASH函数
- 字符串Hash函数
- 经典字符串HASH函数
- 字符串Hash函数比较
- 字符串Hash函数
- 各种字符串Hash函数
- WIN网络编程-TCPClient
- WIN网络编程-TCPServer
- 小汇编习题"HELLO?"
- java
- VBA使用备忘录
- 字符串Hash函数评估
- php的安装与调试
- WIN网络编程-select(I/O模型)
- 尘埃落定
- 外观模式Facade
- c# 中serialport学习(中断接收)
- WIN网络编程-获取本地适配器信息
- ARM-Linux下用Servfox和Spcaview 建立嵌入式视频监控系统
- win网络编程-列出IP地址