我正在使用 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/