2 using System.Collections.Generic;
\r
3 using System.Diagnostics;
\r
5 using System.Security.Cryptography;
\r
7 using System.Threading;
\r
8 using System.Threading.Tasks;
\r
9 using System.Threading.Tasks.Dataflow;
\r
11 using OpenSSL.Crypto;
\r
14 namespace Pithos.Network
\r
16 //public class MD5BlockCalculator:IDisposable
\r
18 // private MessageDigestContext _hasher ;
\r
20 // private ActionBlock<Tuple<long, byte[],int>> _actionBlock;
\r
22 // private long _currentBlock = 0;
\r
24 // public MD5BlockCalculator(int capacity)
\r
26 // var opt = new ExecutionDataflowBlockOptions { BoundedCapacity = capacity };
\r
27 // _actionBlock = new ActionBlock<Tuple<long, byte[], int>>(t => ProcessBlock(t), opt);
\r
28 // _hasher = new MessageDigestContext(MessageDigest.CreateByName("md5"));
\r
32 // public MD5BlockCalculator()
\r
34 // _actionBlock = new ActionBlock<Tuple<long, byte[], int>>(t => ProcessBlock(t));
\r
35 // _hasher = new MessageDigestContext(MessageDigest.CreateByName("md5"));
\r
39 // private void ProcessBlock(Tuple<long,byte[],int> tuple)
\r
41 // if (tuple.Item1 == _currentBlock)
\r
43 // var size = tuple.Item3;
\r
45 // var buffer= tuple.Item2;
\r
46 // if (size == buffer.Length)
\r
48 // _hasher.Update(buffer);
\r
52 // var block = new byte[size];
\r
53 // Buffer.BlockCopy(buffer, 0, block, 0, size);
\r
54 // _hasher.Update(block);
\r
56 // Interlocked.Increment(ref _currentBlock);
\r
60 // _actionBlock.Post(tuple);
\r
64 // public void PostBlock(long blockIndex,byte[] buffer,int size)
\r
66 // _actionBlock.Post(Tuple.Create(blockIndex, buffer, size));
\r
69 // public async Task<string> GetHash()
\r
71 // _actionBlock.Complete();
\r
72 // await _actionBlock.Completion;
\r
73 // Debug.Assert(_actionBlock.InputCount == 0);
\r
74 // var hashBytes=_hasher.DigestFinal();
\r
75 // var hash=hashBytes.ToHashString();
\r
79 // public void Dispose()
\r
82 // GC.SuppressFinalize(this);
\r
85 // protected virtual void Dispose(bool disposing)
\r
87 // if (disposing && _hasher!=null)
\r
88 // _hasher.Dispose();
\r