我在C / C ++中使用的murmurhash函数就像这里提出的那样:https://sites.google.com/site/murmurhash/(MurmurHash2.cpp)。我在不同的键上多次调用此方法。但是,这种行为不是确定性的。有时对于相同的密钥,我得到不同的结果(相同的密钥,相同的len,相同的种子,不同的返回值)。我调试了它,似乎与以下行有所不同:
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;
}
答案 0 :(得分:1)
您没有向我们展示data
的类型,但该行
unsigned int k = *(unsigned int *)data;
看起来根本错误,可以解释为什么你会看到不同的价值观。如果data
的宽度与unsigned int
的宽度不同或对齐方式不同,则k
的某些字节可能会收到恰好位于*data
的高位字中的垃圾。