Heavily multithread execution. A thread per algorithm. Reduces execution time to half on 2-core and 4-core systems.
This commit is contained in:
@@ -24,6 +24,7 @@ using System.Reflection;
|
|||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
|
using System.Threading;
|
||||||
|
|
||||||
namespace SharpHash
|
namespace SharpHash
|
||||||
{
|
{
|
||||||
@@ -56,7 +57,7 @@ namespace SharpHash
|
|||||||
FileStream fileStream = new FileStream(args[0], FileMode.Open, FileAccess.Read);
|
FileStream fileStream = new FileStream(args[0], FileMode.Open, FileAccess.Read);
|
||||||
|
|
||||||
const Int64 bufferSize = 131072;
|
const Int64 bufferSize = 131072;
|
||||||
byte[] dataBuffer;
|
byte[] dataBuffer = new byte[bufferSize];
|
||||||
|
|
||||||
Console.WriteLine("Checking for magic's file executable in path");
|
Console.WriteLine("Checking for magic's file executable in path");
|
||||||
bool thereIsMagic;
|
bool thereIsMagic;
|
||||||
@@ -112,6 +113,21 @@ namespace SharpHash
|
|||||||
magicProcess.WaitForExit();
|
magicProcess.WaitForExit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Thread tCRC16;
|
||||||
|
Thread tCRC32;
|
||||||
|
Thread tCRC64;
|
||||||
|
Thread tFletcher16;
|
||||||
|
Thread tFletcher32;
|
||||||
|
Thread tAdler32;
|
||||||
|
Thread tMD5;
|
||||||
|
Thread tRIPEMD160;
|
||||||
|
Thread tSHA1;
|
||||||
|
Thread tSHA256;
|
||||||
|
Thread tSHA384;
|
||||||
|
Thread tSHA512;
|
||||||
|
Thread tSHA3;
|
||||||
|
Thread tSpamSum;
|
||||||
|
|
||||||
Console.WriteLine("Initializing CRC16...");
|
Console.WriteLine("Initializing CRC16...");
|
||||||
Checksums.CRC16Context crc16Context = new Checksums.CRC16Context();
|
Checksums.CRC16Context crc16Context = new Checksums.CRC16Context();
|
||||||
crc16Context.Init();
|
crc16Context.Init();
|
||||||
@@ -178,59 +194,342 @@ namespace SharpHash
|
|||||||
Console.Write("\rHashing offset {0}", offset);
|
Console.Write("\rHashing offset {0}", offset);
|
||||||
dataBuffer = new byte[bufferSize];
|
dataBuffer = new byte[bufferSize];
|
||||||
fileStream.Read(dataBuffer, 0, (int)bufferSize);
|
fileStream.Read(dataBuffer, 0, (int)bufferSize);
|
||||||
crc16Context.Update(dataBuffer);
|
|
||||||
crc32Context.Update(dataBuffer);
|
// Initialize a thread per algorithm
|
||||||
crc64Context.Update(dataBuffer);
|
// TODO: Is there a way to reuse the threads? Start() fails if called more than one time
|
||||||
fletcher16Context.Update(dataBuffer);
|
tCRC16 = new Thread(delegate() {
|
||||||
fletcher32Context.Update(dataBuffer);
|
crc16Context.Update(dataBuffer);
|
||||||
adler32Context.Update(dataBuffer);
|
});
|
||||||
md5Context.Update(dataBuffer);
|
tCRC16.IsBackground = true;
|
||||||
ripemd160Context.Update(dataBuffer);
|
tCRC16.Name = "CRC16";
|
||||||
sha1Context.Update(dataBuffer);
|
|
||||||
sha256Context.Update(dataBuffer);
|
tCRC32 = new Thread(delegate() {
|
||||||
sha384Context.Update(dataBuffer);
|
crc32Context.Update(dataBuffer);
|
||||||
sha512Context.Update(dataBuffer);
|
});
|
||||||
sha3Context.Update(dataBuffer);
|
tCRC32.IsBackground = true;
|
||||||
spamsumContext.Update(dataBuffer);
|
tCRC32.Name = "CRC32";
|
||||||
|
|
||||||
|
tCRC64 = new Thread(delegate() {
|
||||||
|
crc64Context.Update(dataBuffer);
|
||||||
|
});
|
||||||
|
tCRC64.IsBackground = true;
|
||||||
|
tCRC64.Name = "CRC64";
|
||||||
|
|
||||||
|
tFletcher16 = new Thread(delegate() {
|
||||||
|
fletcher16Context.Update(dataBuffer);
|
||||||
|
});
|
||||||
|
tFletcher16.IsBackground = true;
|
||||||
|
tFletcher16.Name = "CRC32";
|
||||||
|
|
||||||
|
tFletcher32 = new Thread(delegate() {
|
||||||
|
fletcher32Context.Update(dataBuffer);
|
||||||
|
});
|
||||||
|
tFletcher32.IsBackground = true;
|
||||||
|
tFletcher32.Name = "CRC32";
|
||||||
|
|
||||||
|
tAdler32 = new Thread(delegate() {
|
||||||
|
adler32Context.Update(dataBuffer);
|
||||||
|
});
|
||||||
|
tAdler32.IsBackground = true;
|
||||||
|
tAdler32.Name = "CRC32";
|
||||||
|
|
||||||
|
tMD5 = new Thread(delegate() {
|
||||||
|
md5Context.Update(dataBuffer);
|
||||||
|
});
|
||||||
|
tMD5.IsBackground = true;
|
||||||
|
tMD5.Name = "CRC32";
|
||||||
|
|
||||||
|
tRIPEMD160 = new Thread(delegate() {
|
||||||
|
ripemd160Context.Update(dataBuffer);
|
||||||
|
});
|
||||||
|
tRIPEMD160.IsBackground = true;
|
||||||
|
tRIPEMD160.Name = "CRC32";
|
||||||
|
|
||||||
|
tSHA1 = new Thread(delegate() {
|
||||||
|
sha1Context.Update(dataBuffer);
|
||||||
|
});
|
||||||
|
tSHA1.IsBackground = true;
|
||||||
|
tSHA1.Name = "CRC32";
|
||||||
|
|
||||||
|
tSHA256 = new Thread(delegate() {
|
||||||
|
sha256Context.Update(dataBuffer);
|
||||||
|
});
|
||||||
|
tSHA256.IsBackground = true;
|
||||||
|
tSHA256.Name = "CRC32";
|
||||||
|
|
||||||
|
tSHA384 = new Thread(delegate() {
|
||||||
|
sha384Context.Update(dataBuffer);
|
||||||
|
});
|
||||||
|
tSHA384.IsBackground = true;
|
||||||
|
tSHA384.Name = "CRC32";
|
||||||
|
|
||||||
|
tSHA512 = new Thread(delegate() {
|
||||||
|
sha512Context.Update(dataBuffer);
|
||||||
|
});
|
||||||
|
tSHA512.IsBackground = true;
|
||||||
|
tSHA512.Name = "CRC32";
|
||||||
|
|
||||||
|
tSHA3 = new Thread(delegate() {
|
||||||
|
sha3Context.Update(dataBuffer);
|
||||||
|
});
|
||||||
|
tSHA3.IsBackground = true;
|
||||||
|
tSHA3.Name = "CRC32";
|
||||||
|
|
||||||
|
tSpamSum = new Thread(delegate() {
|
||||||
|
spamsumContext.Update(dataBuffer);
|
||||||
|
});
|
||||||
|
tSpamSum.IsBackground = true;
|
||||||
|
tSpamSum.Name = "CRC32";
|
||||||
|
|
||||||
|
// Start all algorithms
|
||||||
|
tCRC16.Start();
|
||||||
|
tCRC32.Start();
|
||||||
|
tCRC64.Start();
|
||||||
|
tFletcher16.Start();
|
||||||
|
tFletcher32.Start();
|
||||||
|
tAdler32.Start();
|
||||||
|
tMD5.Start();
|
||||||
|
tRIPEMD160.Start();
|
||||||
|
tSHA1.Start();
|
||||||
|
tSHA256.Start();
|
||||||
|
tSHA384.Start();
|
||||||
|
tSHA512.Start();
|
||||||
|
tSHA3.Start();
|
||||||
|
tSpamSum.Start();
|
||||||
|
|
||||||
|
// Wait until all have finished
|
||||||
|
while (tCRC16.IsAlive || tCRC32.IsAlive || tCRC64.IsAlive ||
|
||||||
|
tFletcher16.IsAlive || tFletcher32.IsAlive || tAdler32.IsAlive ||
|
||||||
|
tMD5.IsAlive || tRIPEMD160.IsAlive || tSHA1.IsAlive ||
|
||||||
|
tSHA256.IsAlive || tSHA384.IsAlive || tSHA512.IsAlive ||
|
||||||
|
tSHA3.IsAlive || tSpamSum.IsAlive);
|
||||||
}
|
}
|
||||||
|
|
||||||
dataBuffer = new byte[remainder];
|
dataBuffer = new byte[remainder];
|
||||||
|
|
||||||
fileStream.Read(dataBuffer, 0, (int)remainder);
|
// Initialize a thread per algorithm
|
||||||
crc16Context.Update(dataBuffer);
|
// TODO: Is there a way to reuse the threads? Start() fails if called more than one time
|
||||||
crc32Context.Update(dataBuffer);
|
tCRC16 = new Thread(delegate() {
|
||||||
crc64Context.Update(dataBuffer);
|
crc16Context.Update(dataBuffer);
|
||||||
fletcher16Context.Update(dataBuffer);
|
});
|
||||||
fletcher32Context.Update(dataBuffer);
|
tCRC16.IsBackground = true;
|
||||||
adler32Context.Update(dataBuffer);
|
tCRC16.Name = "CRC16";
|
||||||
md5Context.Update(dataBuffer);
|
|
||||||
ripemd160Context.Update(dataBuffer);
|
tCRC32 = new Thread(delegate() {
|
||||||
sha1Context.Update(dataBuffer);
|
crc32Context.Update(dataBuffer);
|
||||||
sha256Context.Update(dataBuffer);
|
});
|
||||||
sha384Context.Update(dataBuffer);
|
tCRC32.IsBackground = true;
|
||||||
sha512Context.Update(dataBuffer);
|
tCRC32.Name = "CRC32";
|
||||||
sha3Context.Update(dataBuffer);
|
|
||||||
spamsumContext.Update(dataBuffer);
|
tCRC64 = new Thread(delegate() {
|
||||||
|
crc64Context.Update(dataBuffer);
|
||||||
|
});
|
||||||
|
tCRC64.IsBackground = true;
|
||||||
|
tCRC64.Name = "CRC64";
|
||||||
|
|
||||||
|
tFletcher16 = new Thread(delegate() {
|
||||||
|
fletcher16Context.Update(dataBuffer);
|
||||||
|
});
|
||||||
|
tFletcher16.IsBackground = true;
|
||||||
|
tFletcher16.Name = "CRC32";
|
||||||
|
|
||||||
|
tFletcher32 = new Thread(delegate() {
|
||||||
|
fletcher32Context.Update(dataBuffer);
|
||||||
|
});
|
||||||
|
tFletcher32.IsBackground = true;
|
||||||
|
tFletcher32.Name = "CRC32";
|
||||||
|
|
||||||
|
tAdler32 = new Thread(delegate() {
|
||||||
|
adler32Context.Update(dataBuffer);
|
||||||
|
});
|
||||||
|
tAdler32.IsBackground = true;
|
||||||
|
tAdler32.Name = "CRC32";
|
||||||
|
|
||||||
|
tMD5 = new Thread(delegate() {
|
||||||
|
md5Context.Update(dataBuffer);
|
||||||
|
});
|
||||||
|
tMD5.IsBackground = true;
|
||||||
|
tMD5.Name = "CRC32";
|
||||||
|
|
||||||
|
tRIPEMD160 = new Thread(delegate() {
|
||||||
|
ripemd160Context.Update(dataBuffer);
|
||||||
|
});
|
||||||
|
tRIPEMD160.IsBackground = true;
|
||||||
|
tRIPEMD160.Name = "CRC32";
|
||||||
|
|
||||||
|
tSHA1 = new Thread(delegate() {
|
||||||
|
sha1Context.Update(dataBuffer);
|
||||||
|
});
|
||||||
|
tSHA1.IsBackground = true;
|
||||||
|
tSHA1.Name = "CRC32";
|
||||||
|
|
||||||
|
tSHA256 = new Thread(delegate() {
|
||||||
|
sha256Context.Update(dataBuffer);
|
||||||
|
});
|
||||||
|
tSHA256.IsBackground = true;
|
||||||
|
tSHA256.Name = "CRC32";
|
||||||
|
|
||||||
|
tSHA384 = new Thread(delegate() {
|
||||||
|
sha384Context.Update(dataBuffer);
|
||||||
|
});
|
||||||
|
tSHA384.IsBackground = true;
|
||||||
|
tSHA384.Name = "CRC32";
|
||||||
|
|
||||||
|
tSHA512 = new Thread(delegate() {
|
||||||
|
sha512Context.Update(dataBuffer);
|
||||||
|
});
|
||||||
|
tSHA512.IsBackground = true;
|
||||||
|
tSHA512.Name = "CRC32";
|
||||||
|
|
||||||
|
tSHA3 = new Thread(delegate() {
|
||||||
|
sha3Context.Update(dataBuffer);
|
||||||
|
});
|
||||||
|
tSHA3.IsBackground = true;
|
||||||
|
tSHA3.Name = "CRC32";
|
||||||
|
|
||||||
|
tSpamSum = new Thread(delegate() {
|
||||||
|
spamsumContext.Update(dataBuffer);
|
||||||
|
});
|
||||||
|
tSpamSum.IsBackground = true;
|
||||||
|
tSpamSum.Name = "CRC32";
|
||||||
|
|
||||||
|
// Start all algorithms
|
||||||
|
tCRC16.Start();
|
||||||
|
tCRC32.Start();
|
||||||
|
tCRC64.Start();
|
||||||
|
tFletcher16.Start();
|
||||||
|
tFletcher32.Start();
|
||||||
|
tAdler32.Start();
|
||||||
|
tMD5.Start();
|
||||||
|
tRIPEMD160.Start();
|
||||||
|
tSHA1.Start();
|
||||||
|
tSHA256.Start();
|
||||||
|
tSHA384.Start();
|
||||||
|
tSHA512.Start();
|
||||||
|
tSHA3.Start();
|
||||||
|
tSpamSum.Start();
|
||||||
|
|
||||||
|
// Wait until all have finished
|
||||||
|
while (tCRC16.IsAlive || tCRC32.IsAlive || tCRC64.IsAlive ||
|
||||||
|
tFletcher16.IsAlive || tFletcher32.IsAlive || tAdler32.IsAlive ||
|
||||||
|
tMD5.IsAlive || tRIPEMD160.IsAlive || tSHA1.IsAlive ||
|
||||||
|
tSHA256.IsAlive || tSHA384.IsAlive || tSHA512.IsAlive ||
|
||||||
|
tSHA3.IsAlive || tSpamSum.IsAlive);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
dataBuffer = new byte[fileStream.Length];
|
dataBuffer = new byte[fileStream.Length];
|
||||||
|
|
||||||
fileStream.Read(dataBuffer, 0, (int)fileStream.Length);
|
fileStream.Read(dataBuffer, 0, (int)fileStream.Length);
|
||||||
crc16Context.Update(dataBuffer);
|
|
||||||
crc32Context.Update(dataBuffer);
|
// Initialize a thread per algorithm
|
||||||
crc64Context.Update(dataBuffer);
|
// TODO: Is there a way to reuse the threads? Start() fails if called more than one time
|
||||||
fletcher16Context.Update(dataBuffer);
|
tCRC16 = new Thread(delegate() {
|
||||||
fletcher32Context.Update(dataBuffer);
|
crc16Context.Update(dataBuffer);
|
||||||
adler32Context.Update(dataBuffer);
|
});
|
||||||
md5Context.Update(dataBuffer);
|
tCRC16.IsBackground = true;
|
||||||
ripemd160Context.Update(dataBuffer);
|
tCRC16.Name = "CRC16";
|
||||||
sha1Context.Update(dataBuffer);
|
|
||||||
sha256Context.Update(dataBuffer);
|
tCRC32 = new Thread(delegate() {
|
||||||
sha384Context.Update(dataBuffer);
|
crc32Context.Update(dataBuffer);
|
||||||
sha512Context.Update(dataBuffer);
|
});
|
||||||
sha3Context.Update(dataBuffer);
|
tCRC32.IsBackground = true;
|
||||||
spamsumContext.Update(dataBuffer);
|
tCRC32.Name = "CRC32";
|
||||||
|
|
||||||
|
tCRC64 = new Thread(delegate() {
|
||||||
|
crc64Context.Update(dataBuffer);
|
||||||
|
});
|
||||||
|
tCRC64.IsBackground = true;
|
||||||
|
tCRC64.Name = "CRC64";
|
||||||
|
|
||||||
|
tFletcher16 = new Thread(delegate() {
|
||||||
|
fletcher16Context.Update(dataBuffer);
|
||||||
|
});
|
||||||
|
tFletcher16.IsBackground = true;
|
||||||
|
tFletcher16.Name = "CRC32";
|
||||||
|
|
||||||
|
tFletcher32 = new Thread(delegate() {
|
||||||
|
fletcher32Context.Update(dataBuffer);
|
||||||
|
});
|
||||||
|
tFletcher32.IsBackground = true;
|
||||||
|
tFletcher32.Name = "CRC32";
|
||||||
|
|
||||||
|
tAdler32 = new Thread(delegate() {
|
||||||
|
adler32Context.Update(dataBuffer);
|
||||||
|
});
|
||||||
|
tAdler32.IsBackground = true;
|
||||||
|
tAdler32.Name = "CRC32";
|
||||||
|
|
||||||
|
tMD5 = new Thread(delegate() {
|
||||||
|
md5Context.Update(dataBuffer);
|
||||||
|
});
|
||||||
|
tMD5.IsBackground = true;
|
||||||
|
tMD5.Name = "CRC32";
|
||||||
|
|
||||||
|
tRIPEMD160 = new Thread(delegate() {
|
||||||
|
ripemd160Context.Update(dataBuffer);
|
||||||
|
});
|
||||||
|
tRIPEMD160.IsBackground = true;
|
||||||
|
tRIPEMD160.Name = "CRC32";
|
||||||
|
|
||||||
|
tSHA1 = new Thread(delegate() {
|
||||||
|
sha1Context.Update(dataBuffer);
|
||||||
|
});
|
||||||
|
tSHA1.IsBackground = true;
|
||||||
|
tSHA1.Name = "CRC32";
|
||||||
|
|
||||||
|
tSHA256 = new Thread(delegate() {
|
||||||
|
sha256Context.Update(dataBuffer);
|
||||||
|
});
|
||||||
|
tSHA256.IsBackground = true;
|
||||||
|
tSHA256.Name = "CRC32";
|
||||||
|
|
||||||
|
tSHA384 = new Thread(delegate() {
|
||||||
|
sha384Context.Update(dataBuffer);
|
||||||
|
});
|
||||||
|
tSHA384.IsBackground = true;
|
||||||
|
tSHA384.Name = "CRC32";
|
||||||
|
|
||||||
|
tSHA512 = new Thread(delegate() {
|
||||||
|
sha512Context.Update(dataBuffer);
|
||||||
|
});
|
||||||
|
tSHA512.IsBackground = true;
|
||||||
|
tSHA512.Name = "CRC32";
|
||||||
|
|
||||||
|
tSHA3 = new Thread(delegate() {
|
||||||
|
sha3Context.Update(dataBuffer);
|
||||||
|
});
|
||||||
|
tSHA3.IsBackground = true;
|
||||||
|
tSHA3.Name = "CRC32";
|
||||||
|
|
||||||
|
tSpamSum = new Thread(delegate() {
|
||||||
|
spamsumContext.Update(dataBuffer);
|
||||||
|
});
|
||||||
|
tSpamSum.IsBackground = true;
|
||||||
|
tSpamSum.Name = "CRC32";
|
||||||
|
|
||||||
|
// Start all algorithms
|
||||||
|
tCRC16.Start();
|
||||||
|
tCRC32.Start();
|
||||||
|
tCRC64.Start();
|
||||||
|
tFletcher16.Start();
|
||||||
|
tFletcher32.Start();
|
||||||
|
tAdler32.Start();
|
||||||
|
tMD5.Start();
|
||||||
|
tRIPEMD160.Start();
|
||||||
|
tSHA1.Start();
|
||||||
|
tSHA256.Start();
|
||||||
|
tSHA384.Start();
|
||||||
|
tSHA512.Start();
|
||||||
|
tSHA3.Start();
|
||||||
|
tSpamSum.Start();
|
||||||
|
|
||||||
|
// Wait until all have finished
|
||||||
|
while (tCRC16.IsAlive || tCRC32.IsAlive || tCRC64.IsAlive ||
|
||||||
|
tFletcher16.IsAlive || tFletcher32.IsAlive || tAdler32.IsAlive ||
|
||||||
|
tMD5.IsAlive || tRIPEMD160.IsAlive || tSHA1.IsAlive ||
|
||||||
|
tSHA256.IsAlive || tSHA384.IsAlive || tSHA512.IsAlive ||
|
||||||
|
tSHA3.IsAlive || tSpamSum.IsAlive);
|
||||||
}
|
}
|
||||||
|
|
||||||
byte[] crc16Hash = crc16Context.Final();
|
byte[] crc16Hash = crc16Context.Final();
|
||||||
|
|||||||
4
SharpHash/packages.config
Normal file
4
SharpHash/packages.config
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<packages>
|
||||||
|
<package id="SHA3" version="0.9.2" targetFramework="net45" />
|
||||||
|
</packages>
|
||||||
Reference in New Issue
Block a user