2011-04-15 48 views
1
size_t hash(const std::string data) { 
    size_t h(0); 
    for (int i=0; i<data.length(); i++){ 
     h = (h << (31-i)^(h >> i)^data[i]); 
    } 
    h = h%hashsize; 
    return h; 
} 
+0

嗯,我會說它有一個錯誤。看到「31」和size_t一起使用意味着它可能不會混合它想要混合的方式。 – ohmantics 2011-04-15 05:55:43

+0

這將需要大量的鉛筆和紙張工作。函數調用的上下文是什麼? – pjwilliams 2011-04-15 05:57:29

+0

我發現這在網絡的某個地方,並且不理解這個h =(h <<(31-i)^(h >> i)^ data [i]); ' – Vijay 2011-04-15 05:58:52

回答

3

這對std::string的哈希函數,表面上是適合TR1和C++ 11的std::unordered_map<>std::unordered_set<>等即,它試圖在給定std::string用於創建作爲唯一-AS-可能size_t值散列表。

這就是說,這是一個糟糕的散列函數。與unordered_map<>,unordered_set<>等一起提供的任何標準庫實現都會爲標準庫字符串提供內置哈希函數,這些函數的實現比這個更好。

編輯:(響應於評論)<<是按位左移,>>是逐位右移,並^是按位異或,所有這些在此Wikipedia條目簡要討論:Bitwise operation

+0

所以..你的意思是說它會爲該字符串創建唯一的無符號整數!我是對嗎? – Vijay 2011-04-15 06:07:17

+1

@ zombie:不是唯一的,而是儘可能唯一 - 只有32/64位存儲空間(在大多數平臺上),可能存在太多可能的字符串值,以便爲每個字符串生成真正唯一的整數。但是,是的,這是主意。 – ildjarn 2011-04-15 06:10:11

相關問題