1

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

因此,对于我在这里上传的随机歌曲,如果您想自己尝试一下,我正在使用murmurhash-nativenpm 包将其转换为缓冲区,然后像这样散列它:

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);
}

这会打印出4275668817使用默认种子 0 以及3020822739使用种子0xc58f1a7b作为第二个参数时的哈希值。

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

看看这个:github链接

这些是我使用过的课程。我调用 Hashing.goodFast32Hash(HASH_KEY)) 其中 HASH_KEY 等于 0xC58F1A7B。

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

我打电话给 Files.hash(file, Hashing.goodFast32Hash(HASH_KEY)); 使用其中的返回值,我在返回的 HashCode 对象上调用“asInt()”。所以它是一个有符号整数值(负值就可以了)。是的,HASH_KEY 是传递给函数的种子值。

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

这就是我掌握的所有信息,伙计们。任何人都看到我要去哪里错了吗?

4

1 回答 1

1

找到了!Java lib 中的 asInt() 函数以little endian 字节顺序返回带符号的 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
于 2020-03-07T19:01:04.130 回答