C ++我们应该在MurmurHash3参数中传递什么?

时间:2016-08-19 11:10:05

标签: c++ hash murmurhash

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

3 个答案:

答案 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);

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