MurmurHash函数不具有确定性

时间:2013-04-02 11:42:34

标签: c++ c hash

我在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;
}

1 个答案:

答案 0 :(得分:1)

您没有向我们展示data的类型,但该行

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

看起来根本错误,可以解释为什么你会看到不同的价值观。如果data的宽度与unsigned int的宽度不同或对齐方式不同,则k的某些字节可能会收到恰好位于*data的高位字中的垃圾。