C# rhash генерирует хеши, отличные от rhash.exe и utorrent

Я использую C# с RHash для вычисления btih хэшей файла. В настоящее время я использую 3 инструмента для генерации хеша btih:

  1. rhash-1.2.9-src\bindings\mono с librhash-1.2.9-win длл
  2. rhash-1.2.9-win32 инструмент командной строки
  3. Utorrent

Проблема в том, что каждый инструмент генерирует разные подписи для одного и того же файла (фотография сделана мной, она бесплатная):

1:  2FF7858CC0A0B216C3676A807D619FA30101E45F
2:  E6F07BB3C3B3B67531C84E3452980698AC1B0DAA  A:\IMG_0400.JPG
3:  D0B96839A14A8C45BB81AD157805AE73425998E5

Для генерации хеша C# я использую Hasher.GetHashForFile(f.Name, HashType.BTIH); а также rhash --bith в инструменте cmd.

Что я делаю неправильно? Есть ли другой способ рассчитать BTIH?

1 ответ

Решение

Разница между первыми двумя заключается в том, что, согласно RHash исходный код, BTIH хэши требуют, чтобы дополнительные данные были правильно рассчитаны.

init_btih_data функция в calc_sums.c задокументировано с:

Инициализируйте хеш-функцию BTIH. В отличие от других алгоритмов BTIH требует больше данных для правильного вычисления.

В test_hashes.c, BTIH примеры на самом деле рассматриваются по-разному в зависимости от того, USE_BTIH_WITH_TEST_FILENAME был определен.

Тот init_btih_data функция (которая, кажется, вызывается только при запуске приложения командной строки), в свою очередь вызывает rhash_trasmit функционировать несколько раз в зависимости от различных параметров. Как минимум, он будет вызывать его дважды, что, вероятно, объясняет разницу между первыми двумя. Однако он может называть это несколько раз, что, я думаю, объясняет разницу, которую мы видим с uTorrent.

Сложность состоит в том, что в то время как неуправляемая DLL предоставляет rhash_trasmit функции, привязки.NET нет, что означает, что невозможно предоставить дополнительные данные, которые ожидаются.

Другие вопросы по тегам