对于返回32位或64位整数的utf-8字符串,最好的哈希函数是什么,都考虑了性能和“最小冲突”
答案 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/Vo或Jenkins' 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;
}