如题,我需要将一段 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;
}
1
msg7086 2020-11-29 15:02:52 +08:00
乘法不一致吗?还是异或不一致?
|
2
Jirajine 2020-11-29 15:13:29 +08:00 via Android
Java 没有 unsigned 类型,只能用 signed 类型来表示。可能结果看起来不一致,实际上换算过来是一样的。
|
3
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; } |