记录几个经典的字符串hash算法

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

推荐一篇文章:

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

(1)暴雪字符串hash

  1 #include <stdio.h>
  2 #include <string.h>
  3 #include <stdlib.h>
  4 #include <stdint.h>
  5 #include <stdbool.h>
  6
  7 #define MAXTABLELEN 102400000
  8
  9 typedef struct  _HASHTABLE
 10 {
 11     long nHashA;
 12     long nHashB;
 13     bool bExists;
 14 }HASHTABLE, *PHASHTABLE;
 15
 16 const unsigned long nTableLength = MAXTABLELEN;
 17 unsigned long m_tablelength;    // 哈希索引表长度
 18 HASHTABLE *m_HashIndexTable;
 19 unsigned long cryptTable[0x500];
 20
 21 int collc = 0;
 22 int errstr = 0;
 23
 24 void InitCryptTable()
 25 {
 26     unsigned long seed = 0x00100001, index1 = 0, index2 = 0, i;
 27
 28     for( index1 = 0; index1 < 0x100; index1++ )
 29     {
 30         for( index2 = index1, i = 0; i < 5; i++, index2 += 0x100 )
 31         {
 32             unsigned long temp1, temp2;
 33             seed = (seed * 125 + 3) % 0x2AAAAB;
 34             temp1 = (seed & 0xFFFF) << 0x10;
 35             seed = (seed * 125 + 3) % 0x2AAAAB;
 36             temp2 = (seed & 0xFFFF);
 37             cryptTable[index2] = ( temp1 | temp2 );
 38         }
 39     }
 40 }
 41
 42 /************************************************************************/
 43 /*函数名:HashString
 44  *功  能:求取哈希值
 45  *返回值:返回hash值
 46  ************************************************************************/
 47 unsigned long HashString(char *lpszString, unsigned long dwHashType)
 48 {
 49     unsigned char *key = (unsigned char *)lpszString;
 50     unsigned long seed1 = 0x7FED7FED, seed2 = 0xEEEEEEEE;
 51     int ch;
 52
 53     while(*key != 0)
 54     {
 55         ch = toupper(*key++);
 56
 57         seed1 = cryptTable[(dwHashType << 8) + ch] ^ (seed1 + seed2);
 58         seed2 = ch + seed1 + seed2 + (seed2 << 5) + 3;
 59     }
 60     return seed1;
 61 }
 62 /************************************************************************/
 63 /*函数名:Hashed
 64  *功  能:检测一个字符串是否被hash过
 65  *返回值:如果存在,返回位置;否则,返回-1
 66  ************************************************************************/
 67 unsigned long Hashed(char * lpszString)
 68
 69 {
 70     const unsigned long HASH_OFFSET = 0, HASH_A = 1, HASH_B = 2;
 71     //不同的字符串三次hash还会碰撞的率无限接近于不可能
 72     unsigned long nHash = HashString(lpszString, HASH_OFFSET);
 73     unsigned long nHashA = HashString(lpszString, HASH_A);
 74     unsigned long nHashB = HashString(lpszString, HASH_B);
 75     unsigned long nHashStart = nHash % m_tablelength;
 76     unsigned long nHashPos = nHashStart;
 77
 78     while (m_HashIndexTable[nHashPos].bExists)
 79     {
 80         if (m_HashIndexTable[nHashPos].nHashA == nHashA && m_HashIndexTable[nHashPos].nHashB == nHashB)
 81             return nHashPos;
 82         else
 83             nHashPos = (nHashPos + 1) % m_tablelength;
 84
 85         if (nHashPos == nHashStart)
 86             break;
 87     }
 88     errstr++;
 89
 90     return -1; //没有找到
 91 }
 92
 93 /************************************************************************/
 94 /*函数名:Hash
 95  *功  能:hash一个字符串
 96  *返回值:成功,返回true;失败,返回false
 97  ************************************************************************/
 98 bool Hash(char * lpszString)
 99 {
100     const unsigned long HASH_OFFSET = 0, HASH_A = 1, HASH_B = 2;
101     unsigned long nHash = HashString(lpszString, HASH_OFFSET);
102     unsigned long nHashA = HashString(lpszString, HASH_A);
103     unsigned long nHashB = HashString(lpszString, HASH_B);
104     unsigned long nHashStart = nHash % m_tablelength,
105     nHashPos = nHashStart;
106
107     while (m_HashIndexTable[nHashPos].bExists)
108     {
109         nHashPos = (nHashPos + 1) % m_tablelength;
110         if (nHashPos == nHashStart) //一个轮回
111         {
112             collc ++;
113             //hash表中没有空余的位置了,无法完成hash
114             return false;
115         }
116     }
117     m_HashIndexTable[nHashPos].bExists = true;
118     m_HashIndexTable[nHashPos].nHashA = nHashA;
119     m_HashIndexTable[nHashPos].nHashB = nHashB;
120
121     return true;
122 }
123
124 int InitHashTable()
125 {
126     int i;
127
128     InitCryptTable();
129     m_tablelength = nTableLength;
130
131     m_HashIndexTable = (HASHTABLE *)malloc(nTableLength * sizeof(HASHTABLE));
132     if (NULL == m_HashIndexTable) {
133         printf("Init HashTable failure!!\n");
134         return -1;
135     }
136
137     for (i = 0; i < nTableLength; i++ )
138     {
139         m_HashIndexTable[i].nHashA = 0;
140         m_HashIndexTable[i].nHashB = 0;
141         m_HashIndexTable[i].bExists = false;
142     }
143
144     return 0;
145 }
146
147 void do_test()
148 {
149     int count = 0;
150     FILE *fp;
151     char url[2048] = {0};
152
153     fp = fopen("urllist", "rb+");
154     if (NULL == fp) {
155         return;
156     }
157
158     if (InitHashTable()) {
159         return;
160     }
161
162     while (!feof(fp)) {
163         fgets(url, 2048, fp);
164         Hash(url);
165         count++;
166     }
167
168     printf("count: %d\n", count);
169
170     fclose(fp);
171 }
172
173 /*test main*/
174 int main()
175 {
176     do_test();
177
178     printf("conflict: %d\n", collc);
179     printf("not find: %d\n", errstr);
180
181     return 0;
182 }

(2)字符串hash算法 ELFhash

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MOD 10

int ELFhash(char*key)
{
    unsigned long h=0;
    while(*key)
    {
        h = (h << 4) + *key++;
        unsigned long g = h & 0xF0000000L;
        if(g)
            h ^= g >> 24;
        h &= ~g;
    }
    return h % MOD;
}

int main(int argc, char **argv)
{
    if (argc < 2) {
        printf("using %s <string>\n", argv[0]);
        return -1;
    }   

    int num = 0;
    num = ELFhash(argv[1]);

    printf("num is %d\n", num);
}
时间: 2024-07-28 15:45:32

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

字符串hash算法

http://www.cnblogs.com/zyf0163/p/4806951.html hash函数对大家来说不陌生吧 ? 而这次我们就用hash函数来实现字符串匹配. 首先我们会想一下二进制数. 对于任意一个二进制数,我们将它化为10进制的数的方法如下(以二进制数1101101为例): hash用的也是一样的原理,为每一个前缀(也可以后缀,笔者习惯1 base,所以喜欢用前缀来计算,Hash[i] = Hash[i - 1] * x + s[i](其中1 < i <= n,Hash[0]

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

转载自:远航休息栈 字符串Hash总结 Hash是什么意思呢?某度翻译告诉我们: hash 英[hæ?] 美[hæ?]n. 剁碎的食物; #号; 蔬菜肉丁;vt. 把…弄乱; 切碎; 反复推敲; 搞糟; 我觉得Hash是引申出 把...弄乱 的意思. 今天就来谈谈Hash的一种——字符串hash. 据我的理解,Hash就是一个像函数一样的东西,你放进去一个值,它给你输出来一个值.输出的值就是Hash值.一般Hash值会比原来的值更好储存(更小)或比较. 那字符串Hash就非常好理解了.就是把字符

字符串Hash总结(转载)

转载地址 Hash是什么意思呢?某度翻译告诉我们: hash 英[hæ?] 美[hæ?] n. 剁碎的食物; #号; 蔬菜肉丁; vt. 把…弄乱; 切碎; 反复推敲; 搞糟; 我觉得Hash是引申出 把...弄乱 的意思. 今天就来谈谈Hash的一种——字符串hash. 据我的理解,Hash就是一个像函数一样的东西,你放进去一个值,它给你输出来一个值.输出的值就是Hash值.一般Hash值会比原来的值更好储存(更小)或比较. 那字符串Hash就非常好理解了.就是把字符串转换成一个整数的函数.而

字符串hash与字典树

title: 字符串hash与字典树 date: 2018-08-01 22:05:29 tags: acm 算法 字符串 概述 这篇主要是关于字符串里的 字符串hash 和 字符串字典树,,两个都是简单的套模板的东西,,,理解基本思想就行了,,,对了,,还有一个字典树的的变形--01字典树: 字符串hash 如何求一个字符串的hash值 字符串hash的作用就是将 字符串有效的转化为一个整数 ,,这个转化过程利用的是一个 hash函数 例如,,我们选hash函数为 \(hash[i]=(has

PHP核心技术与最佳实践之Hash算法

PHP核心技术与最佳实践之Hash算法 Hash表又称散列表,通过把关键字Key映射到数组中的一个位置来访问记录,以加快查找速度.这个映射函数称为Hash函数,存放记录的数组称为Hash表. 1.     Hash函数 作用是把任意长度的输入,通过Hash算法变换成固定长度的输出,该输出就是Hash值.这种转换是一种压缩映射,也就是Hash值得空间通常远小于输入的空间,不输入可能会散列成相同的输出,而不可能从Hash值来唯一的确定输入值. 一个好的hash函数应该满足以下条件:每个关键字都可以均

对一致性Hash算法,Java代码实现的深入研究

一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读一文中"一致性Hash算法"部分,对于为什么要使用一致性Hash算法和一致性Hash算法的算法原理做了详细的解读. 算法的具体原理这里再次贴上: 先构造一个长度为232的整数环(这个环被称为一致性Hash环),根据节点名称的Hash值(其分布为[0, 232-1])将服务器节点放置在这个Hash环上,然后根据数据的Key值计算得到其Hash值(其分布也为[0, 232-1]),接着在

常见hash算法的原理(转)

常见hash算法的原理 散列表,它是基于快速存取的角度设计的,也是一种典型的“空间换时间”的做法.顾名思义,该数据结构可以理解为一个线性表,但是其中的元素不是紧密排列的,而是可能存在空隙. 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.这个映射函数叫做散列函数,存放记录的数组叫做散列表. 比如我们存储70个元素,但我们可能为这70个元素申请了100个元素的空间.7

[知识点] 字符串Hash

1.前言 字符串的几大主要算法都多少提及过,现在来讲讲一个称不上什么算法, 但是非常常用的东西——字符串Hash. 2.Hash的概念 Hash更详细的概念不多说了,它的作用在于能够对复杂的状态进行简单的表达,更方便的用于判重.在搜索的时候,或是动规的时候,都有过类似的做法.在实际应用中,也是非常重要的,这也就是为什么存在什么暴雪公司的Hash算法等等:加密环节也是Hash的重要之处,MD5码就是一个经典的例子. 字符串Hash的方式多式多样,重点来解释一下最简单的,最常用的. 3.BKDRHa

常见hash算法的原理

转自:http://blog.csdn.net/zxycode007/article/details/6999984 散列表,它是基于快速存取的角度设计的,也是一种典型的“空间换时间”的做法.顾名思义,该数据结构可以理解为一个线性表,但是其中的元素不是紧密排列的,而是可能存在空隙. 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.这个映射函数叫做散列函数,存放记录的