针对特定场景的快速哈希函数

Fast hash function for specific scenario

本文关键字:哈希 函数      更新时间:2023-10-16

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

    b(b
  • (b,b),b),b)
  • 福(酒吧,酒吧)
  • 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。对于几种最坏的情况(像第一个示例这样的长、重复、嵌套循环),该算法在 100 毫秒内运行,但我遇到了很多冲突,我想知道即使在这些情况下我是否可以更接近 O(1) 查找。

试试这个:

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