2009-12-22 57 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