我正在尝试计算和比较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;
}
正如我所说,问题在于,在对所有文件进行散列处理时,我的文件比种子文件多。 我应该以不同的方式处理哈希吗? 我知道在文件末尾,通常的情况是文件中剩余的数据小于文件大小,但不确定如何处理这种情况。
答案 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|
+-----------------+-----------------+-----------------+-----------------+