散列种子文件

时间:2018-10-22 16:19:28

标签: c# bittorrent

我正在尝试计算和比较torrent文件碎片哈希,并遇到了一个问题,即根据我的文件,我会比torrent应用程序生成的torrent文件中的哈希更多。

我有一个散列函数来计算文件碎片的哈希,每个文件都要经过它

      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 :(得分:1)

您对此行的假设不正确:

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

Stream.Read不保证实际上会读取blockSize个字节,您应检查对CALL_READ == blockSize的调用是否完成后是否ReadAsync的调用那么您应该专门处理这种情况。

答案 1 :(得分:1)

这是正确的方法:

+-----------------+-----------------+-----------------+-----------------+
| 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| 
+-----------------+-----------------+-----------------+-----------------+