2012-03-08 69 views
1

什麼爲UTF-8字符串的最佳哈希函數返回32位或64位整數,既考慮到性能和「最小碰撞」什麼是爲UTF-8字符串的最佳哈希

+7

我認爲這取決於你想要散列的字符串。 – phimuemue 2012-03-08 10:39:05

+0

在Christoph建議的[鏈接](http://eternallyconfuzzled.com/tuts/algorithms/jsw_tut_hashing.aspx#fnv)下給出了非常全面的答案。它描述了11個流行的散列函數,包含源代碼,對等和一般性討論。 – 2012-05-04 10:14:06

回答

2

XOR版本djb2算法:

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

它簡單,快速,被認爲是最好的字符串哈希之一。

+0

我認爲'hash * 33'比'(hash << 5)+ hash'更清晰。請放心,編譯器會發現最快的實現。 – ugoren 2012-03-08 12:27:57

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; 
} 
相關問題