首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++我们应该传递什么MurmurHash3参数?

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

Stack Overflow用户
提问于 2016-08-19 11:10:04
回答 3查看 2.9K关注 0票数 1

我对应该为MurmurHash3_x86_128()提供哪些参数感到困惑。murmurhash3代码可以找到https://github.com/aappleby/smhasher/blob/master/src/MurmurHash3.cpp。方法定义如下。

代码语言:javascript
复制
void MurmurHash3_x86_128 ( const void * key, const int len,
                       uint32_t seed, void * out )

我在上面的方法中传递了以下值,但是我的编译器给了我分段错误。我做错什么了?

代码语言:javascript
复制
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;
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-08-19 11:20:09

这个函数把它的散列放在128位内存中。

您要做的是传递一个指针,该指针尚未分配给它。

正确的用法应该是这样的:

代码语言:javascript
复制
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参数:

代码语言:javascript
复制
((uint64_t*)out)[0] = h1;
((uint64_t*)out)[1] = h2;
票数 4
EN

Stack Overflow用户

发布于 2016-08-19 11:12:43

hash_otpt是一个指向任何东西的指针,但是函数期望第四个参数是指向某个内存的指针,因为它将其输出写入这个内存中。在您的示例中,它尝试写操作,但是失败了(因为指针没有初始化,所以没有地方可以写入)。这给了你一个SegmentationFault。

计算出哈希值适合多少个uint64_t (2,因为输出的大小为128位,uint64_t的大小为64位),并分配内存:

代码语言:javascript
复制
hash_otpt = new uint64_t [2];
票数 1
EN

Stack Overflow用户

发布于 2016-08-19 11:19:55

如果你看看文献资料,你可以看到

MurmurHash3_x64_128 ...它有128位的输出.

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

代码语言:javascript
复制
    uint64_t hash_otpt[2]; // This is 128 bits
    MurmurHash3_x64_128(key, (uint64_t)strlen(key), seed, hash_otpt);

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39037577

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档