C++ 我们应该在 MurmurHash3 参数中传递什么?
C++ What should we pass in MurmurHash3 parameters?
我不知道应该为 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;
}
hash_otpt
是一个指向任何内容的指针,但是该函数期望第四个参数是指向某个内存 的指针 ,因为它将其输出写入该内存。在您的示例中,它尝试进行写操作,但失败了(无处可写,因为指针未初始化)。这给你一个 SegmentationFault。
算出散列适合多少uint64_t
s(2,因为输出的大小是128位,而uint64_t
的大小是64位)并分配内存:
hash_otpt = new uint64_t [2];
如果你看the documentation,你可以看到
MurmurHash3_x64_128 ... It has a 128-bit output.
所以,你的代码可以是这样的
uint64_t hash_otpt[2]; // This is 128 bits
MurmurHash3_x64_128(key, (uint64_t)strlen(key), seed, hash_otpt);
请注意,您根本不必动态分配输出。
这个函数把它的散列放在 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;
我不知道应该为 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;
}
hash_otpt
是一个指向任何内容的指针,但是该函数期望第四个参数是指向某个内存 的指针 ,因为它将其输出写入该内存。在您的示例中,它尝试进行写操作,但失败了(无处可写,因为指针未初始化)。这给你一个 SegmentationFault。
算出散列适合多少uint64_t
s(2,因为输出的大小是128位,而uint64_t
的大小是64位)并分配内存:
hash_otpt = new uint64_t [2];
如果你看the documentation,你可以看到
MurmurHash3_x64_128 ... It has a 128-bit output.
所以,你的代码可以是这样的
uint64_t hash_otpt[2]; // This is 128 bits
MurmurHash3_x64_128(key, (uint64_t)strlen(key), seed, hash_otpt);
请注意,您根本不必动态分配输出。
这个函数把它的散列放在 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;