MurmurHash3_32 Java returns 负数

MurmurHash3_32 Java returns negative numbers

我正在尝试复制 MobileSheetsPro 的文件散列,一个 Android 应用程序,其中有一个 hashcodes.txt,其中包括每个文件的散列,以及路径,最后修改日期和文件大小。我们只关注散列部分。

所以对于我上传的随机歌曲 here 如果你想自己试一试,我正在使用 murmurhash-native npm 包将它转换为缓冲区然后像这样散列它:

const fs = require("fs");
const { promisify } = require("util");
const { murmurHash } = require("murmurhash-native");
const readFileAsync = promisify(fs.readFile);

async function hashcodeObjFromFilePath(filepath) {
    const buf = await readFileAsync(filepath);
    const h = murmurHash(buf);
    console.log(h);
}

当使用默认种子 0 时打印出散列 4275668817,当使用种子 0xc58f1a7b 作为第二个参数时打印出散列 3020822739

问题:应用程序的计算方式似乎不同。开发人员编写了以下内容,但我在他链接的代码中没有看到确切的功能:

Check this out: github link

Those are the classes I've utilized. I call Hashing.goodFast32Hash(HASH_KEY)) where HASH_KEY is equal to 0xC58F1A7B.

编辑 我从开发者那里得到了更多信息:

I call Files.hash(file, Hashing.goodFast32Hash(HASH_KEY)); Using the return value from that, I call "asInt()" on the HashCode object that is returned. So it's a signed integer value (negative values are just fine). And yes, HASH_KEY is the seed value passed to the function.

因为我不擅长 Java 我仍然不知道在 node-js 中复制它...

这就是我所拥有的全部信息,伙计们。 有人看到我哪里出错了吗?

找到了! Java 库中的 asInt() 函数 returns 一个带符号的 int32 * 小端字节序

以下可能不是最简单的方法而是代码

const h = murmurHash(buf, "buffer", 0xc58f1a7b);
// console.log(parseInt(h, 16).toString(2));
const fromHashFile = Buffer.alloc(4);
fromHashFile.writeInt32BE(-1274144557);
console.log(fromHashFile);
console.log(h);
console.log(h.readInt32BE());
console.log("hash from hashcodes file: -1274144557");

向控制台打印以下内容:

<Buffer b4 0e 18 d3>
<Buffer b4 0e 18 d3>
-1274144557
hash from hashcodes file: -1274144557