MurmurHash3_32 Java возвращает отрицательные числа - PullRequest
0 голосов
/ 05 марта 2020

Я пытаюсь реплицировать хеширование файла MobileSheetsPro, приложения Android, в котором есть hashcodes.txt, который содержит ha sh для каждого файла, а также путь, дату последнего изменения и размер файла. Мы просто сосредоточимся на хэшировании.

Итак, для случайной песни, которую я загрузил здесь , если вы хотите попробовать ее самостоятельно, я использую пакет murmurhash-native npm преобразовать его в буфер, а затем иметь sh, например, так:

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

Это выдает ха sh из 4275668817 при использовании начального числа 0 и 3020822739 при использовании семя 0xc58f1a7b в качестве второго аргумента.

Проблема: приложение, кажется, вычисляет его по-другому. Разработчик написал следующее, но я не вижу точной функции в коде, который он связал:

Проверьте это: ссылка на github

Это классы, которые я использовал. Я звоню Hashing.goodFast32Ha sh (HASH_KEY)) где HASH_KEY равен 0xC58F1A7B.

EDIT Я получил больше информации от разработчика:

Я звоню в Files.ha sh (file, Hashing.goodFast32Ha sh (HASH_KEY)); Используя возвращаемое значение, я вызываю asInt () для возвращаемого объекта HashCode. Так что это целочисленное значение со знаком (отрицательные значения просто в порядке). И да, HASH_KEY - это начальное значение, передаваемое функции.

Поскольку я не очень хорош в Java, я до сих пор не знаю, повторить это в node-js ...

Это все, что у меня есть, ребята. Кто-нибудь видит, где я иду не так?

1 Ответ

0 голосов
/ 07 марта 2020

Нашли это! Функция asInt () в библиотеке Java возвращает подписанное 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
...