【发布时间】:2014-06-06 19:59:03
【问题描述】:
我有 2 个独立的应用程序,一个是 Java,另一个是 C++。我同时使用 Murmurhash3。但是,在 C++ 中,对于相同的字符串,与 Java 相比,我得到了不同的结果
这是来自 C++ 的一个:https://code.google.com/p/smhasher/source/browse/trunk/MurmurHash3.cpp?r=144
我正在使用以下功能:
void MurmurHash3_x86_32 ( const void * key, int len,
uint32_t seed, void * out )
上面的相同 Java 代码有多个版本。
这就是我调用 Java 的方式:
String s = new String("b2622f5e1310a0aa14b7f957fe4246fa");
System.out.println(MurmurHash3.murmurhash3_x86_32(s.getBytes(), 0, s.length(), 2147368987));
我从 Java 得到的输出: -1868221715
我从 C++ 得到的输出 3297211900
当我测试其他一些示例字符串时,例如 “7c6c5be91430a56187060e06fd64dcb8”和“7e7e5f2613d0a2a8c591f101fe8c7351”在 Java 和 C++ 中匹配。
欢迎指点
【问题讨论】:
-
我对java不太了解,但我一直认为它的内部字符串字节是utf16
-
我尝试了以下方法:s = new String("b2622f5e1310a0aa14b7f957fe4246fa".getBytes(), "UTF-16"); System.out.println(MurmurHash3.murmurhash3_x86_32(s.getBytes(), 0, s.length(), MURMUR_SEED));我仍然看到差异
-
你可能想要输出你塞入 murmur 函数的大小和单个字节,看看它们是否相同
-
内部 Java
Strings 是 UTF-16 大端,但是当您调用getBytes()时,它会返回给您默认的平台编码。如果您没有显式设置它,请始终假定它是 EBCDIC 或同样可怕的东西,并指定显式编码。
标签: java c++ murmurhash