MurmurHash3_32 Java返回负数

问题描述 投票:0回答:1

我正在尝试复制Android应用程序MobileSheetsPro的文件哈希,其中有一个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的散列,而将种子3020822739用作第二个参数时将输出0xc58f1a7b的散列。

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

签出:github link

这些是我所使用的类。我打电话Hashing.goodFast32Hash(HASH_KEY)),其中HASH_KEY等于0xC58F1A7B。

EDIT我从开发人员那里获得了更多信息:

我叫Files.hash(file,Hashing.goodFast32Hash(HASH_KEY));使用返回值,我在HashCode对象上调用“ asInt()”返回。所以这是一个有符号的整数值(负值只是精细)。是的,HASH_KEY是传递给函数的种子值。

由于我不擅长Java,所以我仍然不知道在node-js中复制它...

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

javascript java node.js hash murmurhash
1个回答
0
投票

找到了! Java库中的asInt()函数返回带符号的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
© www.soinside.com 2019 - 2024. All rights reserved.