Хеширование торрент-файлов - PullRequest
0 голосов
/ 22 октября 2018

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

У меня есть функция хеширования длявычислять хэши частей файла и каждый файл проходит через него

      public static async Task<IEnumerable<byte[]>> CreateHashTableAsync(HashAlgorithm provider,
        Stream inputStream,
        int blockSize,
        IBufferManager bufferManager,
        CancellationToken ct)
    {
        if (provider == null)
            throw new ArgumentNullException(nameof(provider));

        if (inputStream == null)
            throw new ArgumentNullException(nameof(inputStream));

        if (bufferManager == null)
            throw new ArgumentNullException(nameof(bufferManager));

        var HASH_TABLE = new List<byte[]>();

        var BUFFER = bufferManager.TakeBuffer(blockSize);

        int CALL_READ = 0;
        while ((CALL_READ = await inputStream.ReadAsync(BUFFER, 0, blockSize, ct).ConfigureAwait(false)) > 0)
        {                
            ct.ThrowIfCancellationRequested();
            var BLOCK_HASH = provider.ComputeHash(BUFFER, 0, CALL_READ);
            HASH_TABLE.Add(BLOCK_HASH);
        }

        BUFFER = null;

        return HASH_TABLE;

    }

Как я уже сказал, проблема в том, что в конце хеширования всех файлов у меня немного больше частей, чем в торрент-файле.Должен ли я обращаться с хешированием по-другому?Я понимаю, что в конце файла общепринято, что оставшиеся в файле данные меньше размера куска, но не уверен, как следует обращаться с этой ситуацией.

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Это был бы правильный подход:

+-----------------+-----------------+-----------------+-----------------+
| Piece 0         | Piece 1         | Piece 2         | Piece 3         |
+-----------------+-----------------+-----------------+-----------------+
| File A                   | File B                        | <- file B does not end at the end of piece 3
+-----------------+-----------------+-----------------+-----------------+

Это был бы неправильный подход:

+-----------------+-----------------+-----------------+-----------------+
| Piece 0         | Piece 1         | Piece 2         | Piece 3         |
+-----------------+-----------------+-----------------+-----------------+
| File A                   |00000000| File B                        |000| 
+-----------------+-----------------+-----------------+-----------------+
0 голосов
/ 22 октября 2018

У вас неверное предположение в этой строке:

(CALL_READ = await inputStream.ReadAsync(BUFFER, 0, blockSize, ct)

Stream.Read не гарантирует, что blockSize -байты действительно будут прочитаны, вы должны проверить, если CALL_READ == blockSize послевызов ReadAsync завершен, и если этого не произойдет, вам следует обратиться именно к этому делу.

...