Skip to content

Instantly share code, notes, and snippets.

@TorstenC
Created July 20, 2018 18:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save TorstenC/e16e6c798fa4a5e1c650b7234de9c790 to your computer and use it in GitHub Desktop.
Save TorstenC/e16e6c798fa4a5e1c650b7234de9c790 to your computer and use it in GitHub Desktop.
Test of speed of .NET HashAlgorithms
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.IO;
using System.Security.Cryptography;
using System.Diagnostics;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace ConceptTest {
[TestClass]
public class HashTestTemp {
private readonly string[] _TestFiles = {
@"C:\MusikKopien\07 - Pop\Glenn Frey - The heat is on.mp3",
@"C:\Users\Torsten\Downloads\ubuntu-16.04.3-server-amd64.iso", //825MB
@"C:\MusikKopien\07 - Pop\Opus - Live Is Life.mp3"
};
[TestMethod]
public void HashTest() {
var _Stopwatch = new Stopwatch();
long _TotalSize = 0;
bool _IsParallel = false;
var _HashCalcFunctions = new List<HashCalcBase>();
_HashCalcFunctions.Add(new SHA384HashCalc());
_HashCalcFunctions.Add(new SHA256HashCalc());
_HashCalcFunctions.Add(new MD5HashCalc());
_HashCalcFunctions.Add(new SHA512HashCalc());
_HashCalcFunctions.Add(new RIPEMD160HashCalc());
_HashCalcFunctions.Add(new SHA1HashCalc());
_HashCalcFunctions.Add(new KeyedHashAlgorithmHashCalc());
_Stopwatch.Restart();
foreach (var _TestFile in _TestFiles) {
var _FSI = new FileInfo(_TestFile);
_TotalSize += _FSI.Length;
//https://docs.microsoft.com/de-de/dotnet/standard/parallel-programming/how-to-write-a-simple-parallel-foreach-loop
if (_IsParallel) Parallel.ForEach(_HashCalcFunctions, (_HashFunc) => _HashFunc.Calc(_FSI));
else foreach (var _HashFunc in _HashCalcFunctions) _HashFunc.Calc(_FSI);
}
_Stopwatch.Stop();
Console.WriteLine("Parallel gerechnet" + "\t" + _IsParallel);
Console.WriteLine("Gesamt-Dauer" + "\t" + _Stopwatch.Elapsed.TotalMilliseconds);
Console.WriteLine("Gesamt-Volumen" + "\t" + _TotalSize);
Console.WriteLine("HashAlgorithm\tBytes\tDauer");
foreach (var _HashFunc in _HashCalcFunctions) {
Console.WriteLine(_HashFunc.Result);
}
}
}
public abstract class HashCalcBase {
public TimeSpan SumOfEllapsedTimes;
public int BytesCount { get; private set; }
public abstract string Name { get; }
public void Calc(FileInfo fileInfo) {
var _HashAlgorithm = NewHashAlgorithm();
using (var stream = File.OpenRead(fileInfo.FullName)) {
_Stopwatch.Restart();
var _Dummy = _HashAlgorithm.ComputeHash(stream);
_Stopwatch.Stop();
BytesCount = _Dummy.Length;
}
_HashAlgorithm.Dispose();
SumOfEllapsedTimes += _Stopwatch.Elapsed;
}
public string Result => Name + "\t" + BytesCount + "\t" + SumOfEllapsedTimes.TotalMilliseconds;
private Stopwatch _Stopwatch = new Stopwatch();
public abstract HashAlgorithm NewHashAlgorithm();
}
public class SHA256HashCalc : HashCalcBase {
public override string Name => "SHA256";
public override HashAlgorithm NewHashAlgorithm() { return SHA256.Create(); }
}
public class MD5HashCalc : HashCalcBase {
public override string Name => "MD5";
public override HashAlgorithm NewHashAlgorithm() { return MD5.Create(); }
}
public class KeyedHashAlgorithmHashCalc : HashCalcBase {
public override string Name => "KeyedHashAlgorithm";
public override HashAlgorithm NewHashAlgorithm() { return KeyedHashAlgorithm.Create(); }
}
public class RIPEMD160HashCalc : HashCalcBase {
public override string Name => "RIPEMD160";
public override HashAlgorithm NewHashAlgorithm() { return RIPEMD160.Create(); }
}
public class SHA1HashCalc : HashCalcBase {
public override string Name => "SHA1";
public override HashAlgorithm NewHashAlgorithm() { return SHA1.Create(); }
}
public class SHA384HashCalc : HashCalcBase {
public override string Name => "SHA384";
public override HashAlgorithm NewHashAlgorithm() { return SHA384.Create(); }
}
public class SHA512HashCalc : HashCalcBase {
public override string Name => "SHA512";
public override HashAlgorithm NewHashAlgorithm() { return SHA512.Create(); }
}
}
@TorstenC
Copy link
Author

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment