c++ - MurmurHash 函数不具有确定性

标签 c++ c hash

我正在使用 C/C++ 中的 murmurhash 函数,就像这里建议的那样:https://sites.google.com/site/murmurhash/ (MurmurHash2.cpp)。我在不同的键上多次调用此方法。但是,该行为不是确定性的。有时对于相同的键,我会得到不同的结果(相同的键,相同的长度,相同的种子,不同的返回值)。我调试了一下,好像和下面这行不一样:

line 33: unsigned int k = *(unsigned int *)data;

在该行之后,该方法的相同输入有不同的 k 值,这也会导致最终返回的 h 不同。

我是不是误会了什么?导致这种行为的问题可能是什么? 提前致谢!

关于调用的更多细节:

调用来自 Lua 代码,Lua 代码调用具有以下签名的 C 函数:

int preparehash(lua_State *L)

此函数然后从 Lua 堆栈中读取参数并调用以下使用 MurmurHash2 的函数:

unsigned int hashing(const char *a, unsigned int seed) {
        int len = (int)sizeof(a);
        unsigned int b = MurmurHash2(a,len,seed);
        return b;
}

最佳答案

你没有告诉我们 data 的类型,但是那一行

unsigned int k = *(unsigned int *)data;

从根本上看是错误的,可以解释为什么您会看到不同的值。如果 data 的宽度与 unsigned int 不同或对齐方式不同,k 的某些字节可能会收到一些恰好位于高位的垃圾*data 中的单词。

关于c++ - MurmurHash 函数不具有确定性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15763213/

相关文章:

c - 数组索引的散列

c++ - 我可以在 'setDefaultButton' 中使用我自己的用户定义字符串吗

c - 在双向链表上使用插入排序并写入文件

c - 从文件读取字节并存储在数组中 - C

algorithm - 散列树结构

arrays - 使用一与两个 block 参数调用 `Hash#map`

c++ - 不同编译器上 double 的不同行为

c++ - std::regex 对用户定义的表达式安全吗?

C++ 通过引用传入 Vector 但更改仍未保存

c - 下面的c程序是如何工作的?