1

我对应该为 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;
}
4

3 回答 3

4

该函数将其哈希值放入 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;
于 2016-08-19T11:20:09.103 回答
1

hash_otpt是一个空指针,但函数期望第四个参数是指向某个内存的指针,因为它将输出写入该内存。在您的示例中,它尝试写入操作,但失败(由于指针未初始化,因此无处可写)。这会给你一个 SegmentationFault。

uint64_t找出散列适合多少个s(2,因为输出的大小是 128 位,而 a 的大小uint64_t是 64 位)并分配内存:

hash_otpt = new uint64_t [2];
于 2016-08-19T11:12:43.747 回答
0

如果您查看文档,您可以看到

MurmurHash3_x64_128 ... 它具有 128 位输出。

所以,你的代码可以是这样的

    uint64_t hash_otpt[2]; // This is 128 bits
    MurmurHash3_x64_128(key, (uint64_t)strlen(key), seed, hash_otpt);

请注意,您根本不必动态分配输出。

于 2016-08-19T11:19:55.113 回答