特定场景的快速哈希函数

时间:2015-01-13 11:27:36

标签: c++ hash

我正在寻找快速哈希函数,用于哈希表查找。输入由递归形式f(x,y)的表达式组成,其中x和y可以是具有两个参数或变量的函数。几个例子:

  • B(B(B(B,B),b)中,b)中
  • FOO(巴,巴)
  • A(A(A,A),A(A(A,A),A))

然而,这些表达式最多可达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)查找即便在这些情况下。

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;
}