gpt4 book ai didi

java - Java 和 C++ 之间的 Murmurhash3 不对齐

转载 作者:行者123 更新时间:2023-11-28 02:46:59 24 4
gpt4 key购买 nike

我有 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 的:http://search-hadoop.com/c/HBase:hbase-common/src/main/java/org/apache/hadoop/hbase/util/MurmurHash3.java||server+void+%2522hash

上面的相同 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++ 中匹配。

不胜感激

最佳答案

我可以看到两个问题。首先,C++ 使用 uint32_t,并为您提供 3,297,211,900 的值。这个数字大于带符号的 32 位 int 所能容纳的数字,而 Java 只使用带符号的整数。但是,-1,868,221,715 不等于 3,297,211,900,即使考虑了有符号整数和无符号整数之间的差异。

(在 Java 8 中,他们添加了 Integer.toUnsignedString(int),它将有符号的 32 位 int 转换为其无符号字符串表示形式。在早期版本的 Java 中,您可以将 intlong 然后屏蔽掉高位:((long) i) & 0xffffffffL.)

第二个问题是您使用了错误版本的 getBytes()。不带参数的方法使用默认平台编码将 Unicode String 转换为 byte[],这可能因系统设置而异。它可能为您提供 UTF-8、Latin1、Windows-1252、KOI8-R、Shift-JIS、EBCDIC 等。

在任何情况下,永远、永远、永远不要调用 String.getBytes() 的无参数版本。它应该被弃用、摧毁、防御、销毁和删除。

改用 s.getBytes("UTF-8")(或您期望获得的任何编码)。

正如 Python 之禅 所说,“显式优于隐式。”

我不知道除了这两个之外是否还有其他问题。

关于java - Java 和 C++ 之间的 Murmurhash3 不对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24089740/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com