public void Crc16RandomData() { byte[] data = new byte[1048576]; FileStream fs = new FileStream(Path.Combine(Consts.TestFilesRoot, "checksums", "random"), FileMode.Open, FileAccess.Read); fs.Read(data, 0, 1048576); fs.Close(); fs.Dispose(); Crc16Context.Data(data, out byte[] result); Assert.AreEqual(ExpectedRandom, result); }
public void Crc16RandomInstance() { byte[] data = new byte[1048576]; FileStream fs = new FileStream(Path.Combine(Consts.TestFilesRoot, "checksums", "random"), FileMode.Open, FileAccess.Read); fs.Read(data, 0, 1048576); fs.Close(); fs.Dispose(); IChecksum ctx = new Crc16Context(); ctx.Update(data); byte[] result = ctx.Final(); Assert.AreEqual(ExpectedRandom, result); }
internal Checksum() { adler32ctx = new Adler32Context(); crc16ctx = new Crc16Context(); crc32ctx = new Crc32Context(); crc64ctx = new Crc64Context(); md5ctx = new Md5Context(); ripemd160ctx = new Ripemd160Context(); sha1ctx = new Sha1Context(); sha256ctx = new Sha256Context(); sha384ctx = new Sha384Context(); sha512ctx = new Sha512Context(); ssctx = new SpamSumContext(); adlerThread = new Thread(updateAdler); crc16Thread = new Thread(updateCRC16); crc32Thread = new Thread(updateCRC32); crc64Thread = new Thread(updateCRC64); md5Thread = new Thread(updateMD5); ripemd160Thread = new Thread(updateRIPEMD160); sha1Thread = new Thread(updateSHA1); sha256Thread = new Thread(updateSHA256); sha384Thread = new Thread(updateSHA384); sha512Thread = new Thread(updateSHA512); spamsumThread = new Thread(updateSpamSum); adlerPkt = new adlerPacket(); crc16Pkt = new crc16Packet(); crc32Pkt = new crc32Packet(); crc64Pkt = new crc64Packet(); md5Pkt = new md5Packet(); ripemd160Pkt = new ripemd160Packet(); sha1Pkt = new sha1Packet(); sha256Pkt = new sha256Packet(); sha384Pkt = new sha384Packet(); sha512Pkt = new sha512Packet(); spamsumPkt = new spamsumPacket(); adlerPkt.context = adler32ctx; crc16Pkt.context = crc16ctx; crc32Pkt.context = crc32ctx; crc64Pkt.context = crc64ctx; md5Pkt.context = md5ctx; ripemd160Pkt.context = ripemd160ctx; sha1Pkt.context = sha1ctx; sha256Pkt.context = sha256ctx; sha384Pkt.context = sha384ctx; sha512Pkt.context = sha512ctx; spamsumPkt.context = ssctx; }
internal static List <ChecksumType> GetChecksums(byte[] data, EnableChecksum enabled = EnableChecksum.All) { IChecksum adler32CtxData = null; IChecksum crc16CtxData = null; IChecksum crc32CtxData = null; IChecksum crc64CtxData = null; IChecksum md5CtxData = null; #if !NETSTANDARD2_0 IChecksum ripemd160CtxData = null; #endif IChecksum sha1CtxData = null; IChecksum sha256CtxData = null; IChecksum sha384CtxData = null; IChecksum sha512CtxData = null; IChecksum ssctxData = null; IChecksum f16CtxData = null; IChecksum f32CtxData = null; Thread adlerThreadData = new Thread(UpdateHash); Thread crc16ThreadData = new Thread(UpdateHash); Thread crc32ThreadData = new Thread(UpdateHash); Thread crc64ThreadData = new Thread(UpdateHash); Thread md5ThreadData = new Thread(UpdateHash); #if !NETSTANDARD2_0 Thread ripemd160ThreadData = new Thread(UpdateHash); #endif Thread sha1ThreadData = new Thread(UpdateHash); Thread sha256ThreadData = new Thread(UpdateHash); Thread sha384ThreadData = new Thread(UpdateHash); Thread sha512ThreadData = new Thread(UpdateHash); Thread spamsumThreadData = new Thread(UpdateHash); Thread f16ThreadData = new Thread(UpdateHash); Thread f32ThreadData = new Thread(UpdateHash); if (enabled.HasFlag(EnableChecksum.Adler32)) { adler32CtxData = new Adler32Context(); HashPacket adlerPktData = new HashPacket { Context = adler32CtxData, Data = data }; adlerThreadData.Start(adlerPktData); } if (enabled.HasFlag(EnableChecksum.Crc16)) { crc16CtxData = new Crc16Context(); HashPacket crc16PktData = new HashPacket { Context = crc16CtxData, Data = data }; crc16ThreadData.Start(crc16PktData); } if (enabled.HasFlag(EnableChecksum.Crc32)) { crc32CtxData = new Crc32Context(); HashPacket crc32PktData = new HashPacket { Context = crc32CtxData, Data = data }; crc32ThreadData.Start(crc32PktData); } if (enabled.HasFlag(EnableChecksum.Crc64)) { crc64CtxData = new Crc64Context(); HashPacket crc64PktData = new HashPacket { Context = crc64CtxData, Data = data }; crc64ThreadData.Start(crc64PktData); } if (enabled.HasFlag(EnableChecksum.Md5)) { md5CtxData = new Md5Context(); HashPacket md5PktData = new HashPacket { Context = md5CtxData, Data = data }; md5ThreadData.Start(md5PktData); } #if !NETSTANDARD2_0 if (enabled.HasFlag(EnableChecksum.Ripemd160)) { ripemd160CtxData = new Ripemd160Context(); HashPacket ripemd160PktData = new HashPacket { Context = ripemd160CtxData, Data = data }; ripemd160ThreadData.Start(ripemd160PktData); } #endif if (enabled.HasFlag(EnableChecksum.Sha1)) { sha1CtxData = new Sha1Context(); HashPacket sha1PktData = new HashPacket { Context = sha1CtxData, Data = data }; sha1ThreadData.Start(sha1PktData); } if (enabled.HasFlag(EnableChecksum.Sha256)) { sha256CtxData = new Sha256Context(); HashPacket sha256PktData = new HashPacket { Context = sha256CtxData, Data = data }; sha256ThreadData.Start(sha256PktData); } if (enabled.HasFlag(EnableChecksum.Sha384)) { sha384CtxData = new Sha384Context(); HashPacket sha384PktData = new HashPacket { Context = sha384CtxData, Data = data }; sha384ThreadData.Start(sha384PktData); } if (enabled.HasFlag(EnableChecksum.Sha512)) { sha512CtxData = new Sha512Context(); HashPacket sha512PktData = new HashPacket { Context = sha512CtxData, Data = data }; sha512ThreadData.Start(sha512PktData); } if (enabled.HasFlag(EnableChecksum.SpamSum)) { ssctxData = new SpamSumContext(); HashPacket spamsumPktData = new HashPacket { Context = ssctxData, Data = data }; spamsumThreadData.Start(spamsumPktData); } if (enabled.HasFlag(EnableChecksum.Fletcher16)) { f16CtxData = new Fletcher16Context(); HashPacket f16PktData = new HashPacket { Context = f16CtxData, Data = data }; f16ThreadData.Start(f16PktData); } if (enabled.HasFlag(EnableChecksum.Fletcher32)) { f32CtxData = new Fletcher32Context(); HashPacket f32PktData = new HashPacket { Context = f32CtxData, Data = data }; f32ThreadData.Start(f32PktData); } while (adlerThreadData.IsAlive || crc16ThreadData.IsAlive || crc32ThreadData.IsAlive || crc64ThreadData.IsAlive || md5ThreadData.IsAlive || #if !NETSTANDARD2_0 ripemd160ThreadData.IsAlive || #endif sha1ThreadData.IsAlive || sha256ThreadData.IsAlive || sha384ThreadData.IsAlive || sha512ThreadData.IsAlive || spamsumThreadData.IsAlive || f16ThreadData.IsAlive || f32ThreadData.IsAlive) { } List <ChecksumType> dataChecksums = new List <ChecksumType>(); ChecksumType chk; if (enabled.HasFlag(EnableChecksum.Adler32)) { chk = new ChecksumType { type = ChecksumTypeType.adler32, Value = adler32CtxData.End() }; dataChecksums.Add(chk); } if (enabled.HasFlag(EnableChecksum.Crc16)) { chk = new ChecksumType { type = ChecksumTypeType.crc16, Value = crc16CtxData.End() }; dataChecksums.Add(chk); } if (enabled.HasFlag(EnableChecksum.Crc32)) { chk = new ChecksumType { type = ChecksumTypeType.crc32, Value = crc32CtxData.End() }; dataChecksums.Add(chk); } if (enabled.HasFlag(EnableChecksum.Crc64)) { chk = new ChecksumType { type = ChecksumTypeType.crc64, Value = crc64CtxData.End() }; dataChecksums.Add(chk); } if (enabled.HasFlag(EnableChecksum.Md5)) { chk = new ChecksumType { type = ChecksumTypeType.md5, Value = md5CtxData.End() }; dataChecksums.Add(chk); } #if !NETSTANDARD2_0 if (enabled.HasFlag(EnableChecksum.Ripemd160)) { chk = new ChecksumType { type = ChecksumTypeType.ripemd160, Value = ripemd160CtxData.End() }; dataChecksums.Add(chk); } #endif if (enabled.HasFlag(EnableChecksum.Sha1)) { chk = new ChecksumType { type = ChecksumTypeType.sha1, Value = sha1CtxData.End() }; dataChecksums.Add(chk); } if (enabled.HasFlag(EnableChecksum.Sha256)) { chk = new ChecksumType { type = ChecksumTypeType.sha256, Value = sha256CtxData.End() }; dataChecksums.Add(chk); } if (enabled.HasFlag(EnableChecksum.Sha384)) { chk = new ChecksumType { type = ChecksumTypeType.sha384, Value = sha384CtxData.End() }; dataChecksums.Add(chk); } if (enabled.HasFlag(EnableChecksum.Sha512)) { chk = new ChecksumType { type = ChecksumTypeType.sha512, Value = sha512CtxData.End() }; dataChecksums.Add(chk); } if (enabled.HasFlag(EnableChecksum.SpamSum)) { chk = new ChecksumType { type = ChecksumTypeType.spamsum, Value = ssctxData.End() }; dataChecksums.Add(chk); } if (enabled.HasFlag(EnableChecksum.Fletcher16)) { chk = new ChecksumType { type = ChecksumTypeType.fletcher16, Value = f16CtxData.End() }; dataChecksums.Add(chk); } if (enabled.HasFlag(EnableChecksum.Fletcher32)) { chk = new ChecksumType { type = ChecksumTypeType.fletcher32, Value = f32CtxData.End() }; dataChecksums.Add(chk); } return(dataChecksums); }
public static BenchmarkResults Do(int bufferSize, int blockSize) { BenchmarkResults results = new BenchmarkResults { Entries = new Dictionary <string, BenchmarkEntry>(), MinMemory = long.MaxValue, MaxMemory = 0, SeparateTime = 0 }; MemoryStream ms = new MemoryStream(bufferSize); Random rnd = new Random(); DateTime start; DateTime end; start = DateTime.Now; InitProgress(); for (int i = 0; i < bufferSize / blockSize; i++) { UpdateProgress("Writing block {0} of {1} with random data.", i + 1, bufferSize / blockSize); byte[] tmp = new byte[blockSize]; rnd.NextBytes(tmp); ms.Write(tmp, 0, blockSize); } EndProgress(); end = DateTime.Now; results.FillTime = (end - start).TotalSeconds; results.FillSpeed = bufferSize / 1048576.0 / (end - start).TotalSeconds; ms.Seek(0, SeekOrigin.Begin); long mem = GC.GetTotalMemory(false); if (mem > results.MaxMemory) { results.MaxMemory = mem; } if (mem < results.MinMemory) { results.MinMemory = mem; } start = DateTime.Now; InitProgress(); for (int i = 0; i < bufferSize / blockSize; i++) { UpdateProgress("Reading block {0} of {1}.", i + 1, bufferSize / blockSize); byte[] tmp = new byte[blockSize]; ms.Read(tmp, 0, blockSize); } EndProgress(); end = DateTime.Now; mem = GC.GetTotalMemory(false); if (mem > results.MaxMemory) { results.MaxMemory = mem; } if (mem < results.MinMemory) { results.MinMemory = mem; } results.ReadTime = (end - start).TotalSeconds; results.ReadSpeed = bufferSize / 1048576.0 / (end - start).TotalSeconds; #region Adler32 IChecksum ctx = new Adler32Context(); ms.Seek(0, SeekOrigin.Begin); mem = GC.GetTotalMemory(false); if (mem > results.MaxMemory) { results.MaxMemory = mem; } if (mem < results.MinMemory) { results.MinMemory = mem; } start = DateTime.Now; InitProgress(); for (int i = 0; i < bufferSize / blockSize; i++) { UpdateProgress("Checksumming block {0} of {1} with Adler32.", i + 1, bufferSize / blockSize); byte[] tmp = new byte[blockSize]; ms.Read(tmp, 0, blockSize); ctx.Update(tmp); } EndProgress(); ctx.End(); end = DateTime.Now; mem = GC.GetTotalMemory(false); if (mem > results.MaxMemory) { results.MaxMemory = mem; } if (mem < results.MinMemory) { results.MinMemory = mem; } results.Entries.Add("Adler32", new BenchmarkEntry { TimeSpan = (end - start).TotalSeconds, Speed = bufferSize / 1048576.0 / (end - start).TotalSeconds }); results.SeparateTime += (end - start).TotalSeconds; #endregion Adler32 #region Fletcher16 ctx = new Fletcher16Context(); ms.Seek(0, SeekOrigin.Begin); mem = GC.GetTotalMemory(false); if (mem > results.MaxMemory) { results.MaxMemory = mem; } if (mem < results.MinMemory) { results.MinMemory = mem; } start = DateTime.Now; InitProgress(); for (int i = 0; i < bufferSize / blockSize; i++) { UpdateProgress("Checksumming block {0} of {1} with Fletcher-16.", i + 1, bufferSize / blockSize); byte[] tmp = new byte[blockSize]; ms.Read(tmp, 0, blockSize); ctx.Update(tmp); } EndProgress(); ctx.End(); end = DateTime.Now; mem = GC.GetTotalMemory(false); if (mem > results.MaxMemory) { results.MaxMemory = mem; } if (mem < results.MinMemory) { results.MinMemory = mem; } results.Entries.Add("Fletcher16", new BenchmarkEntry { TimeSpan = (end - start).TotalSeconds, Speed = bufferSize / 1048576.0 / (end - start).TotalSeconds }); results.SeparateTime += (end - start).TotalSeconds; #endregion Fletcher16 #region Fletcher32 ctx = new Fletcher32Context(); ms.Seek(0, SeekOrigin.Begin); mem = GC.GetTotalMemory(false); if (mem > results.MaxMemory) { results.MaxMemory = mem; } if (mem < results.MinMemory) { results.MinMemory = mem; } start = DateTime.Now; InitProgress(); for (int i = 0; i < bufferSize / blockSize; i++) { UpdateProgress("Checksumming block {0} of {1} with Fletcher-32.", i + 1, bufferSize / blockSize); byte[] tmp = new byte[blockSize]; ms.Read(tmp, 0, blockSize); ctx.Update(tmp); } EndProgress(); ctx.End(); end = DateTime.Now; mem = GC.GetTotalMemory(false); if (mem > results.MaxMemory) { results.MaxMemory = mem; } if (mem < results.MinMemory) { results.MinMemory = mem; } results.Entries.Add("Fletcher32", new BenchmarkEntry { TimeSpan = (end - start).TotalSeconds, Speed = bufferSize / 1048576.0 / (end - start).TotalSeconds }); results.SeparateTime += (end - start).TotalSeconds; #endregion Fletcher32 #region CRC16 ctx = new Crc16Context(); ms.Seek(0, SeekOrigin.Begin); mem = GC.GetTotalMemory(false); if (mem > results.MaxMemory) { results.MaxMemory = mem; } if (mem < results.MinMemory) { results.MinMemory = mem; } start = DateTime.Now; InitProgress(); for (int i = 0; i < bufferSize / blockSize; i++) { UpdateProgress("Checksumming block {0} of {1} with CRC16.", i + 1, bufferSize / blockSize); byte[] tmp = new byte[blockSize]; ms.Read(tmp, 0, blockSize); ctx.Update(tmp); } EndProgress(); ctx.End(); end = DateTime.Now; mem = GC.GetTotalMemory(false); if (mem > results.MaxMemory) { results.MaxMemory = mem; } if (mem < results.MinMemory) { results.MinMemory = mem; } results.Entries.Add("CRC16", new BenchmarkEntry { TimeSpan = (end - start).TotalSeconds, Speed = bufferSize / 1048576.0 / (end - start).TotalSeconds }); results.SeparateTime += (end - start).TotalSeconds; #endregion CRC16 #region CRC32 ctx = new Crc32Context(); ms.Seek(0, SeekOrigin.Begin); mem = GC.GetTotalMemory(false); if (mem > results.MaxMemory) { results.MaxMemory = mem; } if (mem < results.MinMemory) { results.MinMemory = mem; } start = DateTime.Now; InitProgress(); for (int i = 0; i < bufferSize / blockSize; i++) { UpdateProgress("Checksumming block {0} of {1} with CRC32.", i + 1, bufferSize / blockSize); byte[] tmp = new byte[blockSize]; ms.Read(tmp, 0, blockSize); ctx.Update(tmp); } EndProgress(); ctx.End(); end = DateTime.Now; mem = GC.GetTotalMemory(false); if (mem > results.MaxMemory) { results.MaxMemory = mem; } if (mem < results.MinMemory) { results.MinMemory = mem; } results.Entries.Add("CRC32", new BenchmarkEntry { TimeSpan = (end - start).TotalSeconds, Speed = bufferSize / 1048576.0 / (end - start).TotalSeconds }); results.SeparateTime += (end - start).TotalSeconds; #endregion CRC32 #region CRC64 ctx = new Crc64Context(); ms.Seek(0, SeekOrigin.Begin); mem = GC.GetTotalMemory(false); if (mem > results.MaxMemory) { results.MaxMemory = mem; } if (mem < results.MinMemory) { results.MinMemory = mem; } start = DateTime.Now; InitProgress(); for (int i = 0; i < bufferSize / blockSize; i++) { UpdateProgress("Checksumming block {0} of {1} with CRC64.", i + 1, bufferSize / blockSize); byte[] tmp = new byte[blockSize]; ms.Read(tmp, 0, blockSize); ctx.Update(tmp); } EndProgress(); ctx.End(); end = DateTime.Now; mem = GC.GetTotalMemory(false); if (mem > results.MaxMemory) { results.MaxMemory = mem; } if (mem < results.MinMemory) { results.MinMemory = mem; } results.Entries.Add("CRC64", new BenchmarkEntry { TimeSpan = (end - start).TotalSeconds, Speed = bufferSize / 1048576.0 / (end - start).TotalSeconds }); results.SeparateTime += (end - start).TotalSeconds; #endregion CRC64 #region MD5 ctx = new Md5Context(); ms.Seek(0, SeekOrigin.Begin); mem = GC.GetTotalMemory(false); if (mem > results.MaxMemory) { results.MaxMemory = mem; } if (mem < results.MinMemory) { results.MinMemory = mem; } start = DateTime.Now; InitProgress(); for (int i = 0; i < bufferSize / blockSize; i++) { UpdateProgress("Checksumming block {0} of {1} with MD5.", i + 1, bufferSize / blockSize); byte[] tmp = new byte[blockSize]; ms.Read(tmp, 0, blockSize); ctx.Update(tmp); } EndProgress(); ctx.End(); end = DateTime.Now; mem = GC.GetTotalMemory(false); if (mem > results.MaxMemory) { results.MaxMemory = mem; } if (mem < results.MinMemory) { results.MinMemory = mem; } results.Entries.Add("MD5", new BenchmarkEntry { TimeSpan = (end - start).TotalSeconds, Speed = bufferSize / 1048576.0 / (end - start).TotalSeconds }); results.SeparateTime += (end - start).TotalSeconds; #endregion MD5 #if !NETSTANDARD2_0 #region RIPEMD160 ctx = new Ripemd160Context(); ms.Seek(0, SeekOrigin.Begin); mem = GC.GetTotalMemory(false); if (mem > results.MaxMemory) { results.MaxMemory = mem; } if (mem < results.MinMemory) { results.MinMemory = mem; } start = DateTime.Now; InitProgress(); for (int i = 0; i < bufferSize / blockSize; i++) { UpdateProgress("Checksumming block {0} of {1} with RIPEMD160.", i + 1, bufferSize / blockSize); byte[] tmp = new byte[blockSize]; ms.Read(tmp, 0, blockSize); ctx.Update(tmp); } EndProgress(); ctx.End(); end = DateTime.Now; mem = GC.GetTotalMemory(false); if (mem > results.MaxMemory) { results.MaxMemory = mem; } if (mem < results.MinMemory) { results.MinMemory = mem; } results.Entries.Add("RIPEMD160", new BenchmarkEntry { TimeSpan = (end - start).TotalSeconds, Speed = bufferSize / 1048576.0 / (end - start).TotalSeconds }); results.SeparateTime += (end - start).TotalSeconds; #endregion RIPEMD160 #endif #region SHA1 ctx = new Sha1Context(); ms.Seek(0, SeekOrigin.Begin); mem = GC.GetTotalMemory(false); if (mem > results.MaxMemory) { results.MaxMemory = mem; } if (mem < results.MinMemory) { results.MinMemory = mem; } start = DateTime.Now; InitProgress(); for (int i = 0; i < bufferSize / blockSize; i++) { UpdateProgress("Checksumming block {0} of {1} with SHA1.", i + 1, bufferSize / blockSize); byte[] tmp = new byte[blockSize]; ms.Read(tmp, 0, blockSize); ctx.Update(tmp); } EndProgress(); ctx.End(); end = DateTime.Now; mem = GC.GetTotalMemory(false); if (mem > results.MaxMemory) { results.MaxMemory = mem; } if (mem < results.MinMemory) { results.MinMemory = mem; } results.Entries.Add("SHA1", new BenchmarkEntry { TimeSpan = (end - start).TotalSeconds, Speed = bufferSize / 1048576.0 / (end - start).TotalSeconds }); results.SeparateTime += (end - start).TotalSeconds; #endregion SHA1 #region SHA256 ctx = new Sha256Context(); ms.Seek(0, SeekOrigin.Begin); mem = GC.GetTotalMemory(false); if (mem > results.MaxMemory) { results.MaxMemory = mem; } if (mem < results.MinMemory) { results.MinMemory = mem; } start = DateTime.Now; InitProgress(); for (int i = 0; i < bufferSize / blockSize; i++) { UpdateProgress("Checksumming block {0} of {1} with SHA256.", i + 1, bufferSize / blockSize); byte[] tmp = new byte[blockSize]; ms.Read(tmp, 0, blockSize); ctx.Update(tmp); } EndProgress(); ctx.End(); end = DateTime.Now; mem = GC.GetTotalMemory(false); if (mem > results.MaxMemory) { results.MaxMemory = mem; } if (mem < results.MinMemory) { results.MinMemory = mem; } results.Entries.Add("SHA256", new BenchmarkEntry { TimeSpan = (end - start).TotalSeconds, Speed = bufferSize / 1048576.0 / (end - start).TotalSeconds }); results.SeparateTime += (end - start).TotalSeconds; #endregion SHA256 #region SHA384 ctx = new Sha384Context(); ms.Seek(0, SeekOrigin.Begin); mem = GC.GetTotalMemory(false); if (mem > results.MaxMemory) { results.MaxMemory = mem; } if (mem < results.MinMemory) { results.MinMemory = mem; } start = DateTime.Now; InitProgress(); for (int i = 0; i < bufferSize / blockSize; i++) { UpdateProgress("Checksumming block {0} of {1} with SHA384.", i + 1, bufferSize / blockSize); byte[] tmp = new byte[blockSize]; ms.Read(tmp, 0, blockSize); ctx.Update(tmp); } EndProgress(); ctx.End(); end = DateTime.Now; mem = GC.GetTotalMemory(false); if (mem > results.MaxMemory) { results.MaxMemory = mem; } if (mem < results.MinMemory) { results.MinMemory = mem; } results.Entries.Add("SHA384", new BenchmarkEntry { TimeSpan = (end - start).TotalSeconds, Speed = bufferSize / 1048576.0 / (end - start).TotalSeconds }); results.SeparateTime += (end - start).TotalSeconds; #endregion SHA384 #region SHA512 ctx = new Sha512Context(); ms.Seek(0, SeekOrigin.Begin); mem = GC.GetTotalMemory(false); if (mem > results.MaxMemory) { results.MaxMemory = mem; } if (mem < results.MinMemory) { results.MinMemory = mem; } start = DateTime.Now; InitProgress(); for (int i = 0; i < bufferSize / blockSize; i++) { UpdateProgress("Checksumming block {0} of {1} with SHA512.", i + 1, bufferSize / blockSize); byte[] tmp = new byte[blockSize]; ms.Read(tmp, 0, blockSize); ctx.Update(tmp); } EndProgress(); ctx.End(); end = DateTime.Now; mem = GC.GetTotalMemory(false); if (mem > results.MaxMemory) { results.MaxMemory = mem; } if (mem < results.MinMemory) { results.MinMemory = mem; } results.Entries.Add("SHA512", new BenchmarkEntry { TimeSpan = (end - start).TotalSeconds, Speed = bufferSize / 1048576.0 / (end - start).TotalSeconds }); results.SeparateTime += (end - start).TotalSeconds; #endregion SHA512 #region SpamSum ctx = new SpamSumContext(); ms.Seek(0, SeekOrigin.Begin); mem = GC.GetTotalMemory(false); if (mem > results.MaxMemory) { results.MaxMemory = mem; } if (mem < results.MinMemory) { results.MinMemory = mem; } start = DateTime.Now; InitProgress(); for (int i = 0; i < bufferSize / blockSize; i++) { UpdateProgress("Checksumming block {0} of {1} with SpamSum.", i + 1, bufferSize / blockSize); byte[] tmp = new byte[blockSize]; ms.Read(tmp, 0, blockSize); ctx.Update(tmp); } EndProgress(); ctx.End(); end = DateTime.Now; mem = GC.GetTotalMemory(false); if (mem > results.MaxMemory) { results.MaxMemory = mem; } if (mem < results.MinMemory) { results.MinMemory = mem; } results.Entries.Add("SpamSum", new BenchmarkEntry { TimeSpan = (end - start).TotalSeconds, Speed = bufferSize / 1048576.0 / (end - start).TotalSeconds }); results.SeparateTime += (end - start).TotalSeconds; #endregion SpamSum #region Entropy ulong[] entTable = new ulong[256]; ms.Seek(0, SeekOrigin.Begin); mem = GC.GetTotalMemory(false); if (mem > results.MaxMemory) { results.MaxMemory = mem; } if (mem < results.MinMemory) { results.MinMemory = mem; } start = DateTime.Now; InitProgress(); for (int i = 0; i < bufferSize / blockSize; i++) { UpdateProgress("Entropying block {0} of {1}.", i + 1, bufferSize / blockSize); byte[] tmp = new byte[blockSize]; ms.Read(tmp, 0, blockSize); foreach (byte b in tmp) { entTable[b]++; } } EndProgress(); end = DateTime.Now; mem = GC.GetTotalMemory(false); if (mem > results.MaxMemory) { results.MaxMemory = mem; } if (mem < results.MinMemory) { results.MinMemory = mem; } results.EntropyTime = (end - start).TotalSeconds; results.EntropySpeed = bufferSize / 1048576.0 / (end - start).TotalSeconds; #endregion Entropy /* #region Multitasking * start = DateTime.Now; * Checksum allChecksums = new Checksum(); * InitProgress(); * for(int i = 0; i < bufferSize / blockSize; i++) * { * UpdateProgress("Checksumming block {0} of {1} with all algorithms at the same time.", i + 1, * bufferSize / blockSize); * byte[] tmp = new byte[blockSize]; * ms.Read(tmp, 0, blockSize); * * allChecksums.Update(tmp); * } * * EndProgress(); * * allChecksums.End(); * end = DateTime.Now; * mem = GC.GetTotalMemory(false); * if(mem > results.MaxMemory) results.MaxMemory = mem; * if(mem < results.MinMemory) results.MinMemory = mem; * * results.TotalTime = (end - start).TotalSeconds; * results.TotalSpeed = bufferSize / 1048576.0 / results.TotalTime; #endregion */ results.SeparateSpeed = bufferSize / 1048576.0 / results.SeparateTime; return(results); }
public void Crc16RandomFile() { byte[] result = Crc16Context.File(Path.Combine(Consts.TestFilesRoot, "checksums", "random")); Assert.AreEqual(ExpectedRandom, result); }
public void Crc16EmptyFile() { byte[] result = Crc16Context.File(Path.Combine(Consts.TestFilesRoot, "checksums", "empty")); Assert.AreEqual(ExpectedEmpty, result); }
internal static List <ChecksumType> GetChecksums(byte[] data) { Adler32Context adler32ctxData = new Adler32Context(); Crc16Context crc16ctxData = new Crc16Context(); Crc32Context crc32ctxData = new Crc32Context(); Crc64Context crc64ctxData = new Crc64Context(); Md5Context md5ctxData = new Md5Context(); Ripemd160Context ripemd160ctxData = new Ripemd160Context(); Sha1Context sha1ctxData = new Sha1Context(); Sha256Context sha256ctxData = new Sha256Context(); Sha384Context sha384ctxData = new Sha384Context(); Sha512Context sha512ctxData = new Sha512Context(); SpamSumContext ssctxData = new SpamSumContext(); Thread adlerThreadData = new Thread(updateAdler); Thread crc16ThreadData = new Thread(updateCRC16); Thread crc32ThreadData = new Thread(updateCRC32); Thread crc64ThreadData = new Thread(updateCRC64); Thread md5ThreadData = new Thread(updateMD5); Thread ripemd160ThreadData = new Thread(updateRIPEMD160); Thread sha1ThreadData = new Thread(updateSHA1); Thread sha256ThreadData = new Thread(updateSHA256); Thread sha384ThreadData = new Thread(updateSHA384); Thread sha512ThreadData = new Thread(updateSHA512); Thread spamsumThreadData = new Thread(updateSpamSum); adlerPacket adlerPktData = new adlerPacket(); crc16Packet crc16PktData = new crc16Packet(); crc32Packet crc32PktData = new crc32Packet(); crc64Packet crc64PktData = new crc64Packet(); md5Packet md5PktData = new md5Packet(); ripemd160Packet ripemd160PktData = new ripemd160Packet(); sha1Packet sha1PktData = new sha1Packet(); sha256Packet sha256PktData = new sha256Packet(); sha384Packet sha384PktData = new sha384Packet(); sha512Packet sha512PktData = new sha512Packet(); spamsumPacket spamsumPktData = new spamsumPacket(); adler32ctxData.Init(); adlerPktData.context = adler32ctxData; crc16ctxData.Init(); crc16PktData.context = crc16ctxData; crc32ctxData.Init(); crc32PktData.context = crc32ctxData; crc64ctxData.Init(); crc64PktData.context = crc64ctxData; md5ctxData.Init(); md5PktData.context = md5ctxData; ripemd160ctxData.Init(); ripemd160PktData.context = ripemd160ctxData; sha1ctxData.Init(); sha1PktData.context = sha1ctxData; sha256ctxData.Init(); sha256PktData.context = sha256ctxData; sha384ctxData.Init(); sha384PktData.context = sha384ctxData; sha512ctxData.Init(); sha512PktData.context = sha512ctxData; ssctxData.Init(); spamsumPktData.context = ssctxData; adlerPktData.data = data; adlerThreadData.Start(adlerPktData); crc16PktData.data = data; crc16ThreadData.Start(crc16PktData); crc32PktData.data = data; crc32ThreadData.Start(crc32PktData); crc64PktData.data = data; crc64ThreadData.Start(crc64PktData); md5PktData.data = data; md5ThreadData.Start(md5PktData); ripemd160PktData.data = data; ripemd160ThreadData.Start(ripemd160PktData); sha1PktData.data = data; sha1ThreadData.Start(sha1PktData); sha256PktData.data = data; sha256ThreadData.Start(sha256PktData); sha384PktData.data = data; sha384ThreadData.Start(sha384PktData); sha512PktData.data = data; sha512ThreadData.Start(sha512PktData); spamsumPktData.data = data; spamsumThreadData.Start(spamsumPktData); while (adlerThreadData.IsAlive || crc16ThreadData.IsAlive || crc32ThreadData.IsAlive || crc64ThreadData.IsAlive || md5ThreadData.IsAlive || ripemd160ThreadData.IsAlive || sha1ThreadData.IsAlive || sha256ThreadData.IsAlive || sha384ThreadData.IsAlive || sha512ThreadData.IsAlive || spamsumThreadData.IsAlive) { } List <ChecksumType> dataChecksums = new List <ChecksumType>(); ChecksumType chk = new ChecksumType { type = ChecksumTypeType.adler32, Value = adler32ctxData.End() }; dataChecksums.Add(chk); chk = new ChecksumType { type = ChecksumTypeType.crc16, Value = crc16ctxData.End() }; dataChecksums.Add(chk); chk = new ChecksumType { type = ChecksumTypeType.crc32, Value = crc32ctxData.End() }; dataChecksums.Add(chk); chk = new ChecksumType { type = ChecksumTypeType.crc64, Value = crc64ctxData.End() }; dataChecksums.Add(chk); chk = new ChecksumType { type = ChecksumTypeType.md5, Value = md5ctxData.End() }; dataChecksums.Add(chk); chk = new ChecksumType { type = ChecksumTypeType.ripemd160, Value = ripemd160ctxData.End() }; dataChecksums.Add(chk); chk = new ChecksumType { type = ChecksumTypeType.sha1, Value = sha1ctxData.End() }; dataChecksums.Add(chk); chk = new ChecksumType { type = ChecksumTypeType.sha256, Value = sha256ctxData.End() }; dataChecksums.Add(chk); chk = new ChecksumType { type = ChecksumTypeType.sha384, Value = sha384ctxData.End() }; dataChecksums.Add(chk); chk = new ChecksumType { type = ChecksumTypeType.sha512, Value = sha512ctxData.End() }; dataChecksums.Add(chk); chk = new ChecksumType { type = ChecksumTypeType.spamsum, Value = ssctxData.End() }; dataChecksums.Add(chk); return(dataChecksums); }
public bool Open(IFilter imageFilter) { Stream stream = imageFilter.GetDataForkStream(); stream.Seek(0, SeekOrigin.Begin); if (stream.Length < 512) { return(false); } byte[] headerB = new byte[256]; stream.Read(headerB, 0, 256); CpcDiskInfo header = Marshal.ByteArrayToStructureLittleEndian <CpcDiskInfo>(headerB); if (!cpcdskId.SequenceEqual(header.magic) && !edskId.SequenceEqual(header.magic) && !du54Id.SequenceEqual(header.magic)) { return(false); } extended = edskId.SequenceEqual(header.magic); DicConsole.DebugWriteLine("CPCDSK plugin", "Extended = {0}", extended); DicConsole.DebugWriteLine("CPCDSK plugin", "header.magic = \"{0}\"", StringHandlers.CToString(header.magic)); DicConsole.DebugWriteLine("CPCDSK plugin", "header.magic2 = \"{0}\"", StringHandlers.CToString(header.magic2)); DicConsole.DebugWriteLine("CPCDSK plugin", "header.creator = \"{0}\"", StringHandlers.CToString(header.creator)); DicConsole.DebugWriteLine("CPCDSK plugin", "header.tracks = {0}", header.tracks); DicConsole.DebugWriteLine("CPCDSK plugin", "header.sides = {0}", header.sides); if (!extended) { DicConsole.DebugWriteLine("CPCDSK plugin", "header.tracksize = {0}", header.tracksize); } else { for (int i = 0; i < header.tracks; i++) { for (int j = 0; j < header.sides; j++) { DicConsole.DebugWriteLine("CPCDSK plugin", "Track {0} Side {1} size = {2}", i, j, header.tracksizeTable[i * header.sides + j] * 256); } } } ulong currentSector = 0; sectors = new Dictionary <ulong, byte[]>(); addressMarks = new Dictionary <ulong, byte[]>(); ulong readtracks = 0; bool allTracksSameSize = true; ulong sectorsPerTrack = 0; // Seek to first track descriptor stream.Seek(256, SeekOrigin.Begin); for (int i = 0; i < header.tracks; i++) { for (int j = 0; j < header.sides; j++) { // Track not stored in image if (extended && header.tracksizeTable[i * header.sides + j] == 0) { continue; } long trackPos = stream.Position; byte[] trackB = new byte[256]; stream.Read(trackB, 0, 256); CpcTrackInfo trackInfo = Marshal.ByteArrayToStructureLittleEndian <CpcTrackInfo>(trackB); if (!trackId.SequenceEqual(trackInfo.magic)) { DicConsole.ErrorWriteLine("Not the expected track info."); return(false); } DicConsole.DebugWriteLine("CPCDSK plugin", "trackInfo[{1}:{2}].magic = \"{0}\"", StringHandlers.CToString(trackInfo.magic), i, j); DicConsole.DebugWriteLine("CPCDSK plugin", "trackInfo[{1}:{2}].bps = {0}", SizeCodeToBytes(trackInfo.bps), i, j); DicConsole.DebugWriteLine("CPCDSK plugin", "trackInfo[{1}:{2}].dataRate = {0}", trackInfo.dataRate, i, j); DicConsole.DebugWriteLine("CPCDSK plugin", "trackInfo[{1}:{2}].filler = 0x{0:X2}", trackInfo.filler, i, j); DicConsole.DebugWriteLine("CPCDSK plugin", "trackInfo[{1}:{2}].gap3 = 0x{0:X2}", trackInfo.gap3, i, j); DicConsole.DebugWriteLine("CPCDSK plugin", "trackInfo[{1}:{2}].padding = {0}", trackInfo.padding, i, j); DicConsole.DebugWriteLine("CPCDSK plugin", "trackInfo[{1}:{2}].recordingMode = {0}", trackInfo.recordingMode, i, j); DicConsole.DebugWriteLine("CPCDSK plugin", "trackInfo[{1}:{2}].sectors = {0}", trackInfo.sectors, i, j); DicConsole.DebugWriteLine("CPCDSK plugin", "trackInfo[{1}:{2}].side = {0}", trackInfo.side, i, j); DicConsole.DebugWriteLine("CPCDSK plugin", "trackInfo[{1}:{2}].track = {0}", trackInfo.track, i, j); if (trackInfo.sectors != sectorsPerTrack) { if (sectorsPerTrack == 0) { sectorsPerTrack = trackInfo.sectors; } else { allTracksSameSize = false; } } byte[][] thisTrackSectors = new byte[trackInfo.sectors][]; byte[][] thisTrackAddressMarks = new byte[trackInfo.sectors][]; for (int k = 1; k <= trackInfo.sectors; k++) { DicConsole.DebugWriteLine("CPCDSK plugin", "trackInfo[{1}:{2}].sector[{3}].id = 0x{0:X2}", trackInfo.sectorsInfo[k - 1].id, i, j, k); DicConsole.DebugWriteLine("CPCDSK plugin", "trackInfo[{1}:{2}].sector[{3}].len = {0}", trackInfo.sectorsInfo[k - 1].len, i, j, k); DicConsole.DebugWriteLine("CPCDSK plugin", "trackInfo[{1}:{2}].sector[{3}].side = {0}", trackInfo.sectorsInfo[k - 1].side, i, j, k); DicConsole.DebugWriteLine("CPCDSK plugin", "trackInfo[{1}:{2}].sector[{3}].size = {0}", SizeCodeToBytes(trackInfo.sectorsInfo[k - 1].size), i, j, k); DicConsole.DebugWriteLine("CPCDSK plugin", "trackInfo[{1}:{2}].sector[{3}].st1 = 0x{0:X2}", trackInfo.sectorsInfo[k - 1].st1, i, j, k); DicConsole.DebugWriteLine("CPCDSK plugin", "trackInfo[{1}:{2}].sector[{3}].st2 = 0x{0:X2}", trackInfo.sectorsInfo[k - 1].st2, i, j, k); DicConsole.DebugWriteLine("CPCDSK plugin", "trackInfo[{1}:{2}].sector[{3}].track = {0}", trackInfo.sectorsInfo[k - 1].track, i, j, k); int sectLen = extended ? trackInfo.sectorsInfo[k - 1].len : SizeCodeToBytes(trackInfo.sectorsInfo[k - 1].size); byte[] sector = new byte[sectLen]; stream.Read(sector, 0, sectLen); if (sectLen < SizeCodeToBytes(trackInfo.sectorsInfo[k - 1].size)) { byte[] temp = new byte[SizeCodeToBytes(trackInfo.sectorsInfo[k - 1].size)]; Array.Copy(sector, 0, temp, 0, sector.Length); sector = temp; } else if (sectLen > SizeCodeToBytes(trackInfo.sectorsInfo[k - 1].size)) { byte[] temp = new byte[SizeCodeToBytes(trackInfo.sectorsInfo[k - 1].size)]; Array.Copy(sector, 0, temp, 0, temp.Length); sector = temp; } thisTrackSectors[(trackInfo.sectorsInfo[k - 1].id & 0x3F) - 1] = sector; byte[] amForCrc = new byte[8]; amForCrc[0] = 0xA1; amForCrc[1] = 0xA1; amForCrc[2] = 0xA1; amForCrc[3] = (byte)IBMIdType.AddressMark; amForCrc[4] = trackInfo.sectorsInfo[k - 1].track; amForCrc[5] = trackInfo.sectorsInfo[k - 1].side; amForCrc[6] = trackInfo.sectorsInfo[k - 1].id; amForCrc[7] = (byte)trackInfo.sectorsInfo[k - 1].size; Crc16Context.Data(amForCrc, 8, out byte[] amCrc); byte[] addressMark = new byte[22]; Array.Copy(amForCrc, 0, addressMark, 12, 8); Array.Copy(amCrc, 0, addressMark, 20, 2); thisTrackAddressMarks[(trackInfo.sectorsInfo[k - 1].id & 0x3F) - 1] = addressMark; } for (int s = 0; s < thisTrackSectors.Length; s++) { sectors.Add(currentSector, thisTrackSectors[s]); addressMarks.Add(currentSector, thisTrackAddressMarks[s]); currentSector++; if (thisTrackSectors[s].Length > imageInfo.SectorSize) { imageInfo.SectorSize = (uint)thisTrackSectors[s].Length; } } stream.Seek(trackPos, SeekOrigin.Begin); if (extended) { stream.Seek(header.tracksizeTable[i * header.sides + j] * 256, SeekOrigin.Current); imageInfo.ImageSize += (ulong)(header.tracksizeTable[i * header.sides + j] * 256) - 256; } else { stream.Seek(header.tracksize, SeekOrigin.Current); imageInfo.ImageSize += (ulong)header.tracksize - 256; } readtracks++; } } DicConsole.DebugWriteLine("CPCDSK plugin", "Read {0} sectors", sectors.Count); DicConsole.DebugWriteLine("CPCDSK plugin", "Read {0} tracks", readtracks); DicConsole.DebugWriteLine("CPCDSK plugin", "All tracks are same size? {0}", allTracksSameSize); imageInfo.Application = StringHandlers.CToString(header.creator); imageInfo.CreationTime = imageFilter.GetCreationTime(); imageInfo.LastModificationTime = imageFilter.GetLastWriteTime(); imageInfo.MediaTitle = Path.GetFileNameWithoutExtension(imageFilter.GetFilename()); imageInfo.Sectors = (ulong)sectors.Count; imageInfo.XmlMediaType = XmlMediaType.BlockMedia; imageInfo.MediaType = MediaType.CompactFloppy; imageInfo.ReadableSectorTags.Add(SectorTagType.FloppyAddressMark); // Debug writing full disk as raw /* * FileStream foo = new FileStream(Path.GetFileNameWithoutExtension(imageFilter.GetFilename()) + ".bin", FileMode.Create); * for(ulong i = 0; i < (ulong)sectors.Count; i++) * { * byte[] foob; * sectors.TryGetValue(i, out foob); * foo.Write(foob, 0, foob.Length); * } * foo.Close(); */ imageInfo.Cylinders = header.tracks; imageInfo.Heads = header.sides; imageInfo.SectorsPerTrack = (uint)(imageInfo.Sectors / (imageInfo.Cylinders * imageInfo.Heads)); return(true); }