记录几个经典的字符串hash算法,方便以后查看:

推荐一篇文章:

http://www.partow.net/programming/hashfunctions/#

(1)暴雪字符串hash

 #include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdbool.h> #define MAXTABLELEN 102400000 typedef struct _HASHTABLE
{
long nHashA;
long nHashB;
bool bExists;
}HASHTABLE, *PHASHTABLE; const unsigned long nTableLength = MAXTABLELEN;
unsigned long m_tablelength; // 哈希索引表长度
HASHTABLE *m_HashIndexTable;
unsigned long cryptTable[0x500]; int collc = ;
int errstr = ; void InitCryptTable()
{
unsigned long seed = 0x00100001, index1 = , index2 = , i; for( index1 = ; index1 < 0x100; index1++ )
{
for( index2 = index1, i = ; i < ; i++, index2 += 0x100 )
{
unsigned long temp1, temp2;
seed = (seed * + ) % 0x2AAAAB;
temp1 = (seed & 0xFFFF) << 0x10;
seed = (seed * + ) % 0x2AAAAB;
temp2 = (seed & 0xFFFF);
cryptTable[index2] = ( temp1 | temp2 );
}
}
} /************************************************************************/
/*函数名:HashString
*功 能:求取哈希值
*返回值:返回hash值
************************************************************************/
unsigned long HashString(char *lpszString, unsigned long dwHashType)
{
unsigned char *key = (unsigned char *)lpszString;
unsigned long seed1 = 0x7FED7FED, seed2 = 0xEEEEEEEE;
int ch; while(*key != )
{
ch = toupper(*key++); seed1 = cryptTable[(dwHashType << ) + ch] ^ (seed1 + seed2);
seed2 = ch + seed1 + seed2 + (seed2 << ) + ;
}
return seed1;
}
/************************************************************************/
/*函数名:Hashed
*功 能:检测一个字符串是否被hash过
*返回值:如果存在,返回位置;否则,返回-1
************************************************************************/
unsigned long Hashed(char * lpszString) {
const unsigned long HASH_OFFSET = , HASH_A = , HASH_B = ;
//不同的字符串三次hash还会碰撞的率无限接近于不可能
unsigned long nHash = HashString(lpszString, HASH_OFFSET);
unsigned long nHashA = HashString(lpszString, HASH_A);
unsigned long nHashB = HashString(lpszString, HASH_B);
unsigned long nHashStart = nHash % m_tablelength;
unsigned long nHashPos = nHashStart; while (m_HashIndexTable[nHashPos].bExists)
{
if (m_HashIndexTable[nHashPos].nHashA == nHashA && m_HashIndexTable[nHashPos].nHashB == nHashB)
return nHashPos;
else
nHashPos = (nHashPos + ) % m_tablelength; if (nHashPos == nHashStart)
break;
}
errstr++; return -; //没有找到
} /************************************************************************/
/*函数名:Hash
*功 能:hash一个字符串
*返回值:成功,返回true;失败,返回false
************************************************************************/
bool Hash(char * lpszString)
{
const unsigned long HASH_OFFSET = , HASH_A = , HASH_B = ;
unsigned long nHash = HashString(lpszString, HASH_OFFSET);
unsigned long nHashA = HashString(lpszString, HASH_A);
unsigned long nHashB = HashString(lpszString, HASH_B);
unsigned long nHashStart = nHash % m_tablelength,
nHashPos = nHashStart; while (m_HashIndexTable[nHashPos].bExists)
{
nHashPos = (nHashPos + ) % m_tablelength;
if (nHashPos == nHashStart) //一个轮回
{
collc ++;
//hash表中没有空余的位置了,无法完成hash
return false;
}
}
m_HashIndexTable[nHashPos].bExists = true;
m_HashIndexTable[nHashPos].nHashA = nHashA;
m_HashIndexTable[nHashPos].nHashB = nHashB; return true;
} int InitHashTable()
{
int i; InitCryptTable();
m_tablelength = nTableLength; m_HashIndexTable = (HASHTABLE *)malloc(nTableLength * sizeof(HASHTABLE));
if (NULL == m_HashIndexTable) {
printf("Init HashTable failure!!\n");
return -;
} for (i = ; i < nTableLength; i++ )
{
m_HashIndexTable[i].nHashA = ;
m_HashIndexTable[i].nHashB = ;
m_HashIndexTable[i].bExists = false;
} return ;
} void do_test()
{
int count = ;
FILE *fp;
char url[] = {}; fp = fopen("urllist", "rb+");
if (NULL == fp) {
return;
} if (InitHashTable()) {
return;
} while (!feof(fp)) {
fgets(url, , fp);
Hash(url);
count++;
} printf("count: %d\n", count); fclose(fp);
} /*test main*/
int main()
{
do_test(); printf("conflict: %d\n", collc);
printf("not find: %d\n", errstr); return ;
}

(2)字符串hash算法 ELFhash

#include <stdio.h>
#include <string.h>
#include <stdlib.h> #define MOD 10 int ELFhash(char*key)
{
unsigned long h=;
while(*key)
{
h = (h << ) + *key++;
unsigned long g = h & 0xF0000000L;
if(g)
h ^= g >> ;
h &= ~g;
}
return h % MOD;
} int main(int argc, char **argv)
{
if (argc < ) {
printf("using %s <string>\n", argv[]);
return -;
} int num = ;
num = ELFhash(argv[]); printf("num is %d\n", num);
}

记录几个经典的字符串hash算法的更多相关文章

  1. 字符串Hash算法比较

    基本概念所谓完美哈希函数,就是指没有冲突的哈希函数,即对任意的 key1 != key2 有h(key1) != h(key2).设定义域为X,值域为Y, n=|X|,m=|Y|,那么肯定有m> ...

  2. 字符串hash算法

    http://www.cnblogs.com/zyf0163/p/4806951.html hash函数对大家来说不陌生吧 ? 而这次我们就用hash函数来实现字符串匹配. 首先我们会想一下二进制数. ...

  3. HDU 1880 魔咒词典 (字符串hash)

    <题目链接> 题目大意: 就是每个字符串有一个配套的对应字符串,询问的时候,无论输出其中的哪一个字符串,输出另一个,如果不存在这个字符串,直接输出"what?". 解题 ...

  4. Hash 算法与 Manacher 算法

    目录 前言 简单介绍 简述 Hash 冲突 离散化 基本结构 普通 Hash 简述 例题 字符串 Hash 简单介绍 核心思想 基本运算 二维字符串 Hash 例题 兔子与兔子 回文子串的最大长度 后 ...

  5. 字符串hash与字典树

    title: 字符串hash与字典树 date: 2018-08-01 22:05:29 tags: acm 算法 字符串 概述 这篇主要是关于字符串里的 字符串hash 和 字符串字典树,,两个都是 ...

  6. 转载:字符串hash总结(hash是一门优雅的暴力!)

    转载自:远航休息栈 字符串Hash总结 Hash是什么意思呢?某度翻译告诉我们: hash 英[hæʃ] 美[hæʃ]n. 剁碎的食物; #号; 蔬菜肉丁;vt. 把…弄乱; 切碎; 反复推敲; 搞糟 ...

  7. hadoop Partiton中的字符串Hash函数改进

    最近的MapReduce端的Partition根据map生成的Key来进行哈希,导致哈希出来的Reduce端处理任务数量非常不均匀,有些Reduce端处理的数据量非常小(几分钟就执行完成,而最后的pa ...

  8. 转载:字符串HASH

    转载自:Slager_Z 字符串Hash总结 Hash是什么意思呢?某度翻译告诉我们: hash 英[hæʃ] 美[hæʃ]n. 剁碎的食物; #号; 蔬菜肉丁;vt. 把…弄乱; 切碎; 反复推敲; ...

  9. 89.hash算法实现CSDN密码处理

    初始化,数据的行数,hash链表结构体,存储头结点 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdl ...

随机推荐

  1. 三消游戏FSM状态机设计图

    三消游戏FSM状态机设计图 1) 设计FSM图 2) smc配置文件 ///////////////////////////////////////////////////////////////// ...

  2. 【LaTeX排版】LaTeX使用--入门基础<一>

    经过两个多星期,毕业论文终于写完了.由于自己对Word软件并不是很熟悉,再加上在数模时见识过LaTex的强大之处,于是就决定用LaTex进行论文的排版.使用LaTex可以避免像Word那样换台机器而出 ...

  3. linux系统安装mysql数据库

    1.首先关闭linux的防火墙,执行命令 chkconfig iptables off 2.从mysql官网上下载自己适合的mysql版本https://dev.mysql.com/downloads ...

  4. poi excel 常用操作

    基本 Workbook wb= new HSSFWorkbook(); Sheet sheet = wb.createSheet("sheetName"); Row row = s ...

  5. Spring Cloud 入门教程 - 搭建配置中心服务

    简介 Spring Cloud 提供了一个部署微服务的平台,包括了微服务中常见的组件:配置中心服务, API网关,断路器,服务注册与发现,分布式追溯,OAuth2,消费者驱动合约等.我们不必先知道每个 ...

  6. 体育Bank2016会议笔记

    补注:会议全称应该是体育Bank2016体育投融资总裁年会 新华社体育部徐仁基 演讲主题:帮郭川找到大海-->帮民众找到自己真正的体育爱好 激发和培养体育市场是重中之重 将体育培养成生活习惯.生 ...

  7. 得到Android keystore签名的命令方法

    keytool -list -v -keystore keyfile.jks 上面这个命令是用来得到一些签名字符串,这些字符串用来在各种平台上填资料的 再来个手动签名的命令: jarsigner -v ...

  8. vfd折腾(一)

    从一开始驱动一块翻出来的液晶显示屏就想做一个电子时钟,偶然翻到了vfd(Vacuum Fluorescent Display的缩写,意为真空荧光显示屏). 此后就走上了不归路

  9. Effective Java 第三版——41.使用标记接口定义类型

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  10. 从零开始的H5生活

    作为一个新手,要从头学习Html编程语言,需要从最基础的开始.有耐心慢慢来,很容易就看懂了.我所使用的编程软件是Hbuilder. 1.Html文档结构 包括head和body两部分 <!DOC ...