ELFhash
字符串哈希算法(以ELFHash详解)
更多字符串哈希算法请参考:http://blog.csdn.net/AlburtHoffman/article/details/19641123
先来了解一下何为哈希:
// ELF Hash Function
2 unsigned int ELFHash(char *str)
3 {
4 unsigned int hash = 0;
5 unsigned int x = 0;
6
7 while (*str)
8 {
9 hash = (hash << 4) + (*str++);//hash左移4位,把当前字符ASCII存入hash低四位。
10 if ((x = hash & 0xF0000000L) != 0)
11 {
12 //如果最高的四位不为0,则说明字符多余7个,现在正在存第7个字符,如果不处理,再加下一个字符时,第一个字符会被移出,因此要有如下处理。
13 //该处理,如果最高位为0,就会仅仅影响5-8位,否则会影响5-31位,因为C语言使用的算数移位
14 //因为1-4位刚刚存储了新加入到字符,所以不能>>28
15 hash ^= (x >> 24);
16 //上面这行代码并不会对X有影响,本身X和hash的高4位相同,下面这行代码&~即对28-31(高4位)位清零。
17 hash &= ~x;
18 }
19 }
20 //返回一个符号位为0的数,即丢弃最高位,以免函数外产生影响。(我们可以考虑,如果只有字符,符号位不可能为负)
21 return (hash & 0x7FFFFFFF);
22 }
然后用一个例题实践一下吧吧,hdu1800
#include <bits/stdc++.h>
using namespace std; typedef unsigned int ui;
const int N = 7003, MOD = 7003;
int Hash[N], num[N];
int res;
int ELFhash(char *str)//思想就是一直杂糅,使字符之间互相影响
{
ui h = 0, g;
while(*str)
{
h = (h<<4) + *str++; //h左移4位,当前字符占8位,加到h中进行杂糅
if((g = h & 0xf0000000) != 0) //取h最左四位的值,若均为0,则括号中执行与否没区别,故不执行
{
h ^= g>>24; //用h的最左四位的值对h的右起5~8进行杂糅
h &= ~g;//清空h的最左四位
}
}
return h; //因为每次都清空了最左四位,最后结果最多也就是28位二进制整数,不会超int
}
void hash_table(char *str)
{
int k = ELFhash(str);
int t = k % MOD;
while(Hash[t] != k && Hash[t] != -1) t = (t + 1) % MOD;//开放地址法处理hash
if(Hash[t] == -1) num[t] = 1, Hash[t] = k;
else res = max(res, ++num[t]);
}
int main()
{
int n;
char str[100];
while(~ scanf("%d", &n))
{
getchar();
res = 1;
memset(Hash, -1, sizeof Hash);
for(int i = 1; i <= n; i++)
{
scanf("%s", str);
int j = 0;
while(str[j] == '0') j++;
hash_table(str + j);
}
printf("%d\n", res);
}
return 0;
}
ELFhash的更多相关文章
- ELFHash算法解释
// ELF Hash Function unsigned int ELFHash(char *str) { unsigned int hash = 0; unsigned int x = 0; wh ...
- 字符串哈希算法(以ELFHash详解)
更多字符串哈希算法请参考:http://blog.csdn.net/AlburtHoffman/article/details/19641123 先来了解一下何为哈希: 哈希表是根据设定的哈希函数H( ...
- ELFhash - 优秀的字符串哈希算法
ELFhash - 优秀的字符串哈希算法 2016年10月29日 22:12:37 阅读数:6440更多 个人分类: 算法杂论算法精讲数据结构 所属专栏: 算法与数据结构 版权声明:本文为博主原创 ...
- hash算法总结收集
hash算法的意义在于提供了一种快速存取数据的方法,它用一种算法建立键值与真实值之间的对应关系,(每一个真实值只能有一个键值,但是一个键值可以对应多个真实值),这样可以快速在数组等条件中里面存取数据. ...
- 各种字符串Hash函数比较(转)
常用的字符串Hash函数还有ELFHash,APHash等等,都是十分简单有效的方法.这些函数使用位运算使得每一个字符都对最后的函数值产生影响.另外还有以MD5和SHA1为代表的杂凑函数,这些函数几乎 ...
- 哈希(Hask)
编辑 Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值.这种转换是一种压缩映射 ...
- 常用的Hash算法
1.RSHash unsigned int RSHash(const std::string& str) { unsigned int b = 378551; unsigne ...
- 海量字符串查找——bloom filter,c
对于海量字符串的查找,一般有两种方法,一种是建树,还有一种就是bf算法,即布隆过滤器,这个从原来上讲比较简单,也易于实现,主要就是根据哈希算法来实现. int len(char *ch) { int ...
- 一些常用的字符串hash函数
unsigned int RSHash(const std::string& str) { unsigned int b = 378551; unsigned int a = 63689; u ...
随机推荐
- .clearfix:after(清除浮动)中各个属性及值详细解说
清除浮动.clearfix:after一词,从事web前端的朋友们对此不会陌生吧,下面为大家介绍的是.clearfix:after中用到的所有属性及值的含义,对此感兴趣的朋友可以参考下哈想,希望对大家 ...
- netty]--最通用TCP黏包解决方案
netty]--最通用TCP黏包解决方案:LengthFieldBasedFrameDecoder和LengthFieldPrepender 2017年02月19日 15:02:11 惜暮 阅读数:1 ...
- jvm常用参数
-Xms512m:初始堆内存 -Xmx512m:最大堆内存 -XX:PermSize=256m:初始永久代内存(方法区,非堆) -XX:MaxPermSize=256m:最大永久代内存(方法区,非堆) ...
- 各个版本的jee(servlet,jsp)对应的web.xml的模板
参考链接: https://yutuo.net/archives/7048a006eeb2ac85.html
- 哈希表概念和实现,C/C++实现
body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...
- Linux系统管理常用命令用法总结(2)
1.free指令会显示内存的使用情况,包括实体内存,虚拟的交换文件内存,共享内存区段,以及系统核心使用的缓冲区等. 语法:free [-bkmotV][-s <间隔秒数>] 参数说明: - ...
- Linux如何从零开始搭建rsync+serync服务器(centOS6)
一.为什么要用Rsync+sersync架构? 1.sersync是基于Inotify开发的,类似于Inotify-tools的工具 2.sersync可以记录下被监听目录中发生变化的(包括增加.删除 ...
- 开发框架DevExtreme发布v18.2.4|附下载
DevExtreme Complete Subscription是性能最优的 HTML5,CSS 和 JavaScript 移动.Web开发框架,可以直接在Visual Studio集成开发环境,构建 ...
- perl代码调试
perl调试教程 一.DESCRIPTIONA (very) lightweight introduction in the use of the perl debugger, and a point ...
- 实现简单的shell sed替换功能
通过脚本传参数可以实现替换 # -*-coding:utf-8-*- # Author:sunhao import sys f = open('yesterday','r',encoding='utf ...