我对我应该为MurmurHash3_x86_128()提供的参数感到困惑。可以找到murmurhash3代码https://github.com/aappleby/smhasher/blob/master/src/MurmurHash3.cpp。方法定义如下。
void MurmurHash3_x86_128 ( const void * key, const int len,
uint32_t seed, void * out )
我在上面的方法中传递了以下值但是我的编译器给了我分段错误。我做错了什么?
int main()
{
uint64_t seed = 1;
uint64_t *hash_otpt;
const char *key = "hi";
MurmurHash3_x64_128(key, (uint64_t)strlen(key), seed, hash_otpt);
cout << "hashed" << hash_otpt << endl;
return 0;
}
答案 0 :(得分:2)
此函数将其哈希值放在128位内存中。
你正在做的是传递一个尚未分配给它的指针。
正确的用法是这样的:
int main()
{
uint64_t seed = 1;
uint64_t hash_otpt[2]; // allocate 128 bits
const char *key = "hi";
MurmurHash3_x64_128(key, (uint64_t)strlen(key), seed, hash_otpt);
cout << "hashed" << hash_otpt[0] << hash_otpt[1] << endl;
return 0;
}
您可能已经注意到,通过分析MurmurHash3_x86_128
填充out
参数的方式:
((uint64_t*)out)[0] = h1;
((uint64_t*)out)[1] = h2;
答案 1 :(得分:1)
hash_otpt
是一个指向什么都没有的指针,但该函数希望第四个参数是一个指针指向某个内存,因为它将其输出写入此内存。在您的示例中,它尝试写入操作,但失败(因为指针未初始化而无法写入)。这为您提供了SegmentationFault。
弄清楚哈希适合的uint64_t
多少(2,因为输出的大小是128位,uint64_t
的大小是64位)并分配内存:< / p>
hash_otpt = new uint64_t [2];
答案 2 :(得分:0)
如果你看the documentation,就可以看到
MurmurHash3_x64_128 ...它有128位输出。
所以,你的代码可以是这样的
uint64_thash_otpt[2]; // This is 128 bits
MurmurHash3_x64_128(key, (uint64_t)strlen(key), seed, hash_otpt);
请注意,您根本不必动态分配输出。