diff --git a/NDecrypt.CMD/HashingHelper.cs b/NDecrypt.CMD/HashingHelper.cs index 8051dc9..0f74e5e 100644 --- a/NDecrypt.CMD/HashingHelper.cs +++ b/NDecrypt.CMD/HashingHelper.cs @@ -3,7 +3,6 @@ using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading.Tasks; -using Compress.ThreadReaders; using NDecrypt.Tools; namespace NDecrypt.CMD @@ -39,10 +38,8 @@ namespace NDecrypt.CMD }; // Initialize the hashing helpers - var loadBuffer = new ThreadLoadBuffer(inputStream); int buffersize = 3 * 1024 * 1024; - byte[] buffer0 = new byte[buffersize]; - byte[] buffer1 = new byte[buffersize]; + byte[] buffer = new byte[buffersize]; /* Please note that some of the following code is adapted from @@ -52,38 +49,26 @@ namespace NDecrypt.CMD been tweaked to better fit this code base. */ - // Pre load the first buffer + // Pre load the buffer + int next = buffersize > size ? (int)size : buffersize; + int current = inputStream.Read(buffer, 0, next); long refsize = size; - int next = refsize > buffersize ? buffersize : (int)refsize; - inputStream.Read(buffer0, 0, next); - int current = next; - refsize -= next; - bool bufferSelect = true; - - while (current > 0) + + while (refsize > 0) { - // Trigger the buffer load on the second buffer - next = refsize > buffersize ? buffersize : (int)refsize; - if (next > 0) - loadBuffer.Trigger(bufferSelect ? buffer1 : buffer0, next); - - byte[] buffer = bufferSelect ? buffer0 : buffer1; - // Run hashes in parallel - Parallel.ForEach(hashers, h => h.Process(buffer, current)); + if (current > 0) + Parallel.ForEach(hashers, h => h.Process(buffer, current)); + + // Load the next buffer + refsize -= current; + next = buffersize > refsize ? (int)refsize : buffersize; - // Wait for the load buffer worker, if needed if (next > 0) - loadBuffer.Wait(); - - // Setup for the next hashing step - current = next; - refsize -= next; - bufferSelect = !bufferSelect; + current = inputStream.Read(buffer, 0, next); } - + // Finalize all hashing helpers - loadBuffer.Finish(); Parallel.ForEach(hashers, h => h.Terminate()); // Get the results @@ -94,7 +79,6 @@ namespace NDecrypt.CMD + $"SHA256: {ByteArrayToString(hashers.First(h => h.HashType == Hash.SHA256).GetHash()) ?? ""}\n"; // Dispose of the hashers - loadBuffer.Dispose(); hashers.ForEach(h => h.Dispose()); return result; diff --git a/NDecrypt/Tools/ThreadLoadBuffer.cs b/NDecrypt/Tools/ThreadLoadBuffer.cs deleted file mode 100644 index 1063355..0000000 --- a/NDecrypt/Tools/ThreadLoadBuffer.cs +++ /dev/null @@ -1,79 +0,0 @@ -using System; -using System.IO; -using System.Threading; - -namespace Compress.ThreadReaders -{ - public class ThreadLoadBuffer : IDisposable - { - private readonly AutoResetEvent _waitEvent; - private readonly AutoResetEvent _outEvent; - private readonly Thread _tWorker; - - private byte[] _buffer; - private int _size; - private readonly Stream _ds; - private bool _finished; - public bool errorState; - - public int SizeRead; - - public ThreadLoadBuffer(Stream ds) - { - _waitEvent = new AutoResetEvent(false); - _outEvent = new AutoResetEvent(false); - _finished = false; - _ds = ds; - errorState = false; - - _tWorker = new Thread(MainLoop); - _tWorker.Start(); - } - - public void Dispose() - { - _waitEvent.Close(); - _outEvent.Close(); - } - - private void MainLoop() - { - while (true) - { - _waitEvent.WaitOne(); - if (_finished) - { - break; - } - try - { - SizeRead = _ds.Read(_buffer, 0, _size); - } - catch (Exception) - { - errorState = true; - } - _outEvent.Set(); - } - } - - public void Trigger(byte[] buffer, int size) - { - _buffer = buffer; - _size = size; - _waitEvent.Set(); - } - - public void Wait() - { - _outEvent.WaitOne(); - } - - public void Finish() - { - _finished = true; - _waitEvent.Set(); - _tWorker.Join(); - } - } -} \ No newline at end of file