c 语言的一个函数如何转换成 Java 或 scala 代码

2020-11-29 14:46:12 +08:00
 liunaijie

如题,我需要将一段 c 实现的函数转换成 java 或者 scala 代码。这个函数就是下面这个,一个哈希算法,在转换的过程中主要遇到的问题是,x *= 0xff51afd7ed558ccdULL 这一句,x=x*一个数,看这个应该是 16 进制的一个数,然后 U 表示无符号,LL 应该是表示 long long 类型,但是这个代码如何能在 java 中实现出来呢,大体逻辑我能知道,但是就是转换出来的结果跟 c 语言运行得到的结果不一致,希望有大佬能帮忙看一下。

inline DB::UInt64 intHash64(DB::UInt64 x)
{
    x ^= x >> 33;
    x *= 0xff51afd7ed558ccdULL;
    x ^= x >> 33;
    x *= 0xc4ceb9fe1a85ec53ULL;
    x ^= x >> 33;

    return x;
}
1295 次点击
所在节点    问与答
3 条回复
msg7086
2020-11-29 15:02:52 +08:00
乘法不一致吗?还是异或不一致?
Jirajine
2020-11-29 15:13:29 +08:00
Java 没有 unsigned 类型,只能用 signed 类型来表示。可能结果看起来不一致,实际上换算过来是一样的。
Cbdy
2020-11-29 16:06:19 +08:00
public static long intHash64(long x) {

x ^= x >> 33;
x *= Long.parseUnsignedLong("ff51afd7ed558ccd", 16);
x ^= x >> 33;
x *= Long.parseUnsignedLong("c4ceb9fe1a85ec53", 16);
x ^= x >> 33;
return x;

}

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/730308

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX