Rabin-Karp算法的最佳哈希函数是什么?

时间:2012-07-18 17:13:07

标签: c++ c algorithm pseudocode rabin-karp

我正在为Rabin-Karp算法寻找有效的哈希函数。这是我的实际代码(C编程语言)。

static bool f2(char const *const s1, size_t const n1, 
               char const *const s2, size_t const n2)
{
    uintmax_t hsub = hash(s2, n2);
    uintmax_t hs   = hash(s1, n1);
    size_t   nmax = n2 - n1;

    for (size_t i = 0; i < nmax; ++i) {
        if (hs == hsub) {
            if (strncmp(&s1[i], s2, i + n2 - 1) == 0)
                return true;
        }
        hs = hash(&s1[i + 1], i + n2);
    }
    return false;
}

我考虑了一些Rabin-Karp C实现,但所有代码之间存在差异。所以我的问题是:Rabin-Karp哈希函数应该具有哪些特征?

2 个答案:

答案 0 :(得分:9)

一个表现极佳的哈希是伯恩斯坦哈希。它甚至还没有结束 许多流行的哈希算法。

unsigned bernstein_hash ( void *key, int len )
{
    unsigned char *p = key;
    unsigned h = 0;
    int i;

    for ( i = 0; i < len; i++ )
        h = 33 * h + p[i];

    return h;
}

当然,您可以尝试其他哈希算法,如下所述: Hash function on NIST

注意:从未解释为什么33的表现要好得多 比任何其他“更多逻辑”常数。

为了您的兴趣:以下是不同哈希算法的良好比较: strchr comparison of hash algorithms

答案 1 :(得分:0)

对于小字母的问题,例如核酸序列搜索(例如alphabet = {A, T, C, G, U}),nt-Hash可能是很好的哈希函数。 它使用更快的二进制运算和滚动哈希更新,还提供统一的分布式哈希值。