2009-12-22 79 views
1

我在我的C++代碼中實現谷歌密集散列映射。我想使用MurmurHash2(http://murmurhash.googlepages.com/)作爲散列函數。但這是問題。我已經嘗試了很多,但似乎無法使哈希函數工作。該示例顯示了使用默認散列函數(hash < const char *>)。使用散列函數的問題

dense_hash_map < const char * , int, hash < const char*>, eqstr> months; 

我想更換hash< const char * >

unsigned int MurmurHash2 (const char * key, int len, unsigned int seed) 

回答

3

顯然你的dense_hash_map從它的散列函數需要簽名,而MurmurHash2提供簽名之間的不匹配。您必須在自己的函數或函子中執行您自己的「阻礙匹配」,以實現所需的簽名,並在內部使用提供的簽名。然而,這需要能夠確定對應於給定的const char *len,並且沒有明顯的答案。你是否打算在你的哈希映射中只存儲「以空字符結尾的字符數組」,就像在老式的C「僞字符串」中一樣,這樣strlen就足夠了?或者,還有什麼......?

也許使用std::string(或其他一些明確的C++類型取決於你想要達到的目標!)而不是那些可疑的const char *將是一個更好的開始!

+0

嘿謝謝你的回覆。是的,strlen就足夠了。我也可以嘗試使用std :: string。但假設我們知道'len',你能告訴我如何執行「阻抗匹配」。我的意思是,我只是想能夠使用散列函數。我無法創建將使用MurmurHash2作爲散列函數的hash_map。謝謝! – aneesh 2009-12-23 11:23:47

+1

您需要編寫自己的函數(只接受一個參數),並在內部調用MurmurHash2及其三個參數,並將該函數用作hash_map的「哈希函數」。您將永遠無法將三參數函數用作「散列函數」本身:'hash_map'需要一個具有ONE參數的散列函數,因此您必須自己編寫關於該約束的代碼並使用它。爲什麼這是一個問題? – 2009-12-23 16:43:42