Files
SabreTools/SabreTools.Library/External/Compress/ThreadReaders/ThreadSHA1.cs

76 lines
1.7 KiB
C#
Raw Normal View History

using System;
using System.Security.Cryptography;
using System.Threading;
namespace Compress.ThreadReaders
{
public class ThreadSHA1 : IDisposable
{
private readonly AutoResetEvent _waitEvent;
private readonly AutoResetEvent _outEvent;
private readonly Thread _tWorker;
private readonly SHA1 _sha1;
private byte[] _buffer;
private int _size;
private bool _finished;
public ThreadSHA1()
{
_waitEvent = new AutoResetEvent(false);
_outEvent = new AutoResetEvent(false);
_finished = false;
_sha1 = SHA1.Create();
_tWorker = new Thread(MainLoop);
_tWorker.Start();
}
public byte[] Hash => _sha1.Hash;
public void Dispose()
{
_waitEvent.Close();
_outEvent.Close();
// _sha1.Dispose();
}
private void MainLoop()
{
while (true)
{
_waitEvent.WaitOne();
if (_finished)
{
break;
}
_sha1.TransformBlock(_buffer, 0, _size, null, 0);
_outEvent.Set();
}
byte[] tmp = new byte[0];
_sha1.TransformFinalBlock(tmp, 0, 0);
}
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();
}
}
}