【问题标题】:MurmurHash3_32 Java returns negative numbersMurmurHash3_32 Java 返回负数
【发布时间】:2020-06-18 04:45:15
【问题描述】:

我正在尝试复制 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 的哈希值,而在使用种子 0xc58f1a7b 作为第二个参数时会打印出 3020822739

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

看看这个:github link

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

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

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

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

这就是我掌握的所有信息,伙计们。 有人知道我哪里出错了吗?

【问题讨论】:

    标签: javascript java node.js hash murmurhash


    【解决方案1】:

    找到了! Java lib 中的 asInt() 函数返回一个带符号的 int32 *in little endian byte order

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

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-11
      • 2021-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多