in JetBrains.SbomUtils/src/JetBrains.SbomUtils/HashCalculator.cs [10:39]
public static Dictionary<ChecksumAlgorithm, byte[]> ComputeHashes(Stream inputStream, IEnumerable<ChecksumAlgorithm> algorithms)
{
Dictionary<ChecksumAlgorithm, HashAlgorithm>? hashes = null;
try
{
hashes = algorithms.ToDictionary(a => a, CreateHashAlgorithm);
byte[] buffer = ArrayPool<byte>.Shared.Rent(4096);
int bytesRead;
while ((bytesRead = inputStream.Read(buffer, 0, buffer.Length)) > 0)
{
foreach (var hashAlgorithm in hashes.Values)
hashAlgorithm.TransformBlock(buffer, 0, bytesRead, null, 0);
}
foreach (var hashAlgorithm in hashes.Values)
hashAlgorithm.TransformFinalBlock(buffer, 0, 0);
ArrayPool<byte>.Shared.Return(buffer, clearArray: true);
return hashes.ToDictionary(a => a.Key, a => a.Value.Hash);
}
finally
{
if (hashes != null)
foreach (var hashAlgorithm in hashes.Values)
hashAlgorithm.Dispose();
}
}