我正在尝试复制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中复制它...
伙计,这就是我所拥有的全部信息。有人看到我要去哪里了吗?
找到了! 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