我正在寻找快速哈希函数,用于哈希表查找。输入由递归形式f(x,y)的表达式组成,其中x和y可以是具有两个参数或变量的函数。几个例子:
然而,这些表达式最多可达200.000个字符,我需要将数千个表达式散列到同一个表中。我找到了一些有用的东西:
int hash(string s, int n) {
unsigned int v = 37;
for(string::iterator it = s.begin(); it != s.end(); it++)
v = (v * A) ^ (*it * B);
return (v * n) % C;
}
其中输入仅包含表达式的前10个字符和整个表达式的长度。 A,B和C分别为541,733和941。对于几种最坏的情况(如第一个例子的长,重复,嵌套循环),这个算法运行在100ms以下,但是我得到了很多冲突,我想知道我是否可以接近O(1)查找即便在这些情况下。
答案 0 :(得分:0)
试试这个:
uint32_t hash(const string &s, uint32_t n) {
uint32_t step = 1 | (s.size() >> 4); // ~16 iters
uint32_t h = 0x1F351F35; // Barker code - 2
for(uint32_t i = 0; i < s.size(); i += step + (h & step))
h = ((h << 5) | (h >> (32 - 5))) + (s[i] ^ n ^ i);
return h % C;
}