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_ts(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;