ELFhash - 优秀的字符串哈希算法
ELFhash - 优秀的字符串哈希算法
1.字符串哈希:
2.ELFhash
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函数 | 桶数 | Hash调用总数 | 最大桶长 | 平均桶长 | 桶使用率% |
| simple_hash | 10240 | 47198 | 16 | 4.63 | 99.00% |
| RS_hash | 10240 | 47198 | 16 | 4.63 | 98.91% |
| JS_hash | 10240 | 47198 | 15 | 4.64 | 98.87% |
| PJW_hash | 10240 | 47198 | 16 | 4.63 | 99.00% |
| ELF_hash | 10240 | 47198 | 16 | 4.63 | 99.00% |
| BKDR_hash | 10240 | 47198 | 16 | 4.63 | 99.00% |
| SDBM_hash | 10240 | 47198 | 16 | 4.63 | 98.90% |
| DJB_hash | 10240 | 47198 | 15 | 4.64 | 98.85% |
| AP_hash | 10240 | 47198 | 16 | 4.63 | 98.96% |
| CRC_hash | 10240 | 47198 | 16 | 4.64 | 98.77% |
所以实际应用中我们可以随便的选取,本文针对ELFhash
3.原理:
- unsigned int ELFhash(char *str)
- {
- unsigned int hash=0;
- unsigned int x=0;
- while(*str)
- {
- hash=(hash<<4)+*str; //1
- if((x=hash & 0xf0000000)!=0) //2
- {
- hash^=(x>>24); //影响5-8位,杂糅一次 3
- hash&=~x; //清空高四位 4
- }
- str++; //5
- }
- return (hash & 0x7fffffff); //6
- }
解释:
4.Code:
- /*#include"iostream"
- #include"cstdio"
- #include"cstring"
- using namespace std;
- unsigned int a=0x80;
- int main()
- {
- printf("%d\n",a>>1); //无符号数实行逻辑右移
- return 0;
- } */
- #include"iostream"
- #include"cstdio"
- #include"cstring"
- using namespace std;
- unsigned int ELFhash(char *str)
- {
- unsigned int hash=0;
- unsigned int x=0;
- while(*str)
- {
- hash=(hash<<4)+*str;
- if((x=hash & 0xf0000000)!=0)
- {
- hash^=(x>>24); //影响5-8位,杂糅一次
- hash&=~x; //清空高四位
- }
- str++;
- }
- return (hash & 0x7fffffff);
- }
- int main()
- {
- char data[100];
- memset(data,0,sizeof(data));
- scanf("%s",data);
- printf("%d\n",ELFhash(data));
- return 0;
- }
最后,按照我的思路来看的话,ELFhash最多可以散列的空间的大小是几个亿的数据?如果去掉hash&=~x这一句的话会不会扩大我们hash的范围,尽可能利用空间,我下星期问问数据结构老师好了!
5.应用:
sprintf(data,"%0x",&now_data);
第一个data保存我们的保留字符串的内存空间(字符串数组)
利用这种思路,我们可以很清晰明了的对链表相交的问题构建一种新的解法,我们采用哈希我们的内存空间就可以了,可以再O(n)中完成查找
ELFhash - 优秀的字符串哈希算法的更多相关文章
- 字符串哈希算法(以ELFHash详解)
更多字符串哈希算法请参考:http://blog.csdn.net/AlburtHoffman/article/details/19641123 先来了解一下何为哈希: 哈希表是根据设定的哈希函数H( ...
- 【基本算法入门-字符串哈希(Hash)】-C++
字符串哈希入门 说得通俗一点,字符串哈希实质上就是把每个不同的字符串转成不同的整数. 为什么会有这样的需要呢?很明显,存储一个超长的字符串和存储一个超大但是能存的下的整数,后者所占的空间会少的多,但主 ...
- 用哈希算法的思想解决排序和字符串去重问题,时间复杂度为O(N)
第一个题目: int a[] = {12,13,12,13,19,18,15,12,15,16,17},要求对数组a进行排序,要求时间复杂度为O(N) 我们所知道的常规排序中,最优的解法也就是O(N* ...
- java单向加密算法小结(2)--MD5哈希算法
上一篇文章整理了Base64算法的相关知识,严格来说,Base64只能算是一种编码方式而非加密算法,这一篇要说的MD5,其实也不算是加密算法,而是一种哈希算法,即将目标文本转化为固定长度,不可逆的字符 ...
- [基础技能] 安全技术——哈希算法密码破解之彩虹表(Rainbow Table)学习
1.基础知识 刚刚学习过数字签名的相关知识,以及数字签名的伪造技术,而伪造数字签名归根结底就是密码破解的一个过程,然而直接破解的速度是非常缓慢的,所以有人想出一种办法,直接建立出一个数据文件,里面事先 ...
- C# MD5摘要算法、哈希算法
MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致.是计算机广泛使用的杂凑算法之一(又译摘要算法.哈希算法) MD5算法具有以下特点: 1.压缩 ...
- FNV哈希算法
由来:FNV哈希算法全名为Fowler-Noll-Vo算法,是以三位发明人Glenn Fowler,Landon Curt Noll,Phong Vo的名字来命名的,最早在1991年提出. 特点和用途 ...
- 一致性哈希算法学习及JAVA代码实现分析
1,对于待存储的海量数据,如何将它们分配到各个机器中去?---数据分片与路由 当数据量很大时,通过改善单机硬件资源的纵向扩充方式来存储数据变得越来越不适用,而通过增加机器数目来获得水平横向扩展的方式则 ...
- HDU2594 Simpsons’ Hidden Talents 字符串哈希
最近在学习字符串的知识,在字符串上我跟大一的时候是没什么区别的,所以恶补了很多基础的算法,今天补了一下字符串哈希,看的是大一新生的课件学的,以前觉得字符串哈希无非就是跟普通的哈希没什么区别,倒也没觉得 ...
随机推荐
- Luogu P2480 [SDOI2010]古代猪文 卢卡斯+组合+CRT
好吧刚开始以为扩展卢卡斯然后就往上套..结果奇奇怪怪又WA又T...后来才意识到它的因子都是质数...qwq怕不是这就是学知识学傻了.. 题意:$ G^{\Sigma_{d|n} \space C_n ...
- Trie UVALive 7192 Chip Factory (15长春J)
题目传送门 题意:从n个数中选出不同的三个数a b c,使得(a+b)^c 最大 分析:先将所有数字按位插入到字典树上,然后删除两个数字,贪心询问与剩下的数字最大异或值. /************* ...
- spring定时任务的集中实现
转载博主:感谢博主 http://gong1208.iteye.com/blog/1773177 Spring定时任务的几种实现 近日项目开发中需要执行一些定时任务,比如需要在每天凌晨时候,分析一次前 ...
- Tomcat从socket到java Servlet
整体架构图 一. 启动阶段 BootStrap的main方法加载server.xml配置文件,封装成Server,Service,Connector,Engine等java对象 Server初始化== ...
- Options Menu的android3.0以上和以下版本显示刷新原理,刷新适配
一 显示区别: 2.3.x及以下版本,需要按菜单键显示菜单,当菜单打开时,第一个可见的部分是图标菜单,最多可容纳6个菜单项.如果你的菜单包括Android的地方超过6项,第六项,其余将被归到”More ...
- python import error:no module named yaml
解决办法: python2 : sudo apt-get install python-yaml python3 : sudo apt-get install python3-yaml
- 获取跨域请求的自定义的response headers
一般情况下,使用ajax的getAllResponseHeaders这个方法只能得到response headers中的content-type的信息,其他服务器端放入response header中 ...
- postgresql删除还有活动连接的数据库
select pg_terminate_backend(pid) from pg_stat_activity where datname='testdb' and pid<>pg_back ...
- 工厂模式 jdbc 面向接口dao 开发 单例
package com.itheima.utils; import java.io.IOException; import java.io.InputStream; import java.util. ...
- ElasticSearch 全文检索— ElasticSearch 基本操作
REST 简介-定义 REST (REpresentation State Transfer)描述了一个架构样式的网络系统,比如 web 应用程序.它首次出现在 2000 年 Roy Fielding ...