Created
July 20, 2018 18:30
-
-
Save TorstenC/e16e6c798fa4a5e1c650b7234de9c790 to your computer and use it in GitHub Desktop.
Test of speed of .NET HashAlgorithms
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(); } | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Discussion in German: mikrocontroller.net Vergleich .NET Hash Algorithms