utf-8字符串的最佳哈希是什么

时间:2012-03-08 10:38:01

标签: c linux algorithm hash

对于返回32位或64位整数的utf-8字符串,最好的哈希函数是什么,都考虑了性能和“最小冲突”

3 个答案:

答案 0 :(得分:3)

djb2算法的XOR版本:

unsigned long
hash(unsigned char *str)
{
    unsigned long hash = 5381;
    int c;

    while (c = *str++)
        hash = ((hash << 5) + hash) ^ c; // hash(i - 1) * 33 ^ str[i]

    return hash;
}

它简单,快速,被认为是最好的字符串散列之一。

答案 1 :(得分:3)

如果您没有任何其他更具体的要求,我会选择Fowler/Noll/VoJenkins' one-at-a-time

请记住,您应该始终检查您的输入数据是否会触发退化情况(即过度碰撞)。

答案 2 :(得分:0)

我目前使用下面的那个。它并没有从根本上优于* 33 djb版本(或FNV或Jenkins),但它在较低位有一些更好的熵,如果表大小是2的幂,则需要它。

unsigned hash_mem(void *dat, size_t len)
{
unsigned char *str = (unsigned char*) dat;
unsigned val=0;
size_t idx;

for(idx=0; idx < len; idx++ )   {
        val ^= (val >> 2) ^ (val << 5) ^ (val << 13) ^ str[idx] ^ 0x80001801;
        }
return val;
}