From c82a6dc39b17e7b5b9e509bcde37e6881049c8a1 Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Sun, 5 Jan 2025 23:39:00 -0500 Subject: [PATCH] Add stream GetStandardHashes variant --- SabreTools.Hashing.Test/HashToolTests.cs | 15 ++++++++++++++- SabreTools.Hashing/HashTool.cs | 23 +++++++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/SabreTools.Hashing.Test/HashToolTests.cs b/SabreTools.Hashing.Test/HashToolTests.cs index b0ad137..44baa0e 100644 --- a/SabreTools.Hashing.Test/HashToolTests.cs +++ b/SabreTools.Hashing.Test/HashToolTests.cs @@ -32,7 +32,7 @@ namespace SabreTools.Hashing.Test } [Fact] - public void GetStandardHashesTest() + public void GetStandardHashesFileTest() { bool gotHashes = HashTool.GetStandardHashes(_hashFilePath, out long actualSize, out string? crc32, out string? md5, out string? sha1); @@ -43,6 +43,19 @@ namespace SabreTools.Hashing.Test TestHelper.ValidateHash(HashType.SHA1, sha1); } + [Fact] + public void GetStandardHashesStreamTest() + { + var fileStream = File.OpenRead(_hashFilePath); + bool gotHashes = HashTool.GetStandardHashes(fileStream, out long actualSize, out string? crc32, out string? md5, out string? sha1); + + Assert.True(gotHashes); + TestHelper.ValidateSize(actualSize); + TestHelper.ValidateHash(HashType.CRC32, crc32); + TestHelper.ValidateHash(HashType.MD5, md5); + TestHelper.ValidateHash(HashType.SHA1, sha1); + } + [Fact] public void GetFileHashesParallelTest() { diff --git a/SabreTools.Hashing/HashTool.cs b/SabreTools.Hashing/HashTool.cs index 8f917c2..f94f640 100644 --- a/SabreTools.Hashing/HashTool.cs +++ b/SabreTools.Hashing/HashTool.cs @@ -35,6 +35,29 @@ namespace SabreTools.Hashing return true; } + /// + /// Get CRC-32, MD5, and SHA-1 hashes from an input stream + /// + /// Input stream + /// True if hashing was successful, false otherwise + public static bool GetStandardHashes(Stream stream, out long size, out string? crc32, out string? md5, out string? sha1) + { + // Set all initial values + crc32 = null; md5 = null; sha1 = null; + + // Get all file hashes + HashType[] standardHashTypes = [HashType.CRC32, HashType.MD5, HashType.SHA1]; + var fileHashes = GetStreamHashesAndSize(stream, standardHashTypes, out size); + if (fileHashes == null) + return false; + + // Assign the file hashes and return + crc32 = fileHashes[HashType.CRC32]; + md5 = fileHashes[HashType.MD5]; + sha1 = fileHashes[HashType.SHA1]; + return true; + } + #region File Hashes Without Size ///