| File: Utils\HashingUtils.cs | Web Access |
| Project: src\sdk\src\StaticWebAssetsSdk\Tasks\Microsoft.NET.Sdk.StaticWebAssets.Tasks.csproj (Microsoft.NET.Sdk.StaticWebAssets.Tasks) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System.Security.Cryptography; using Microsoft.Build.Framework; namespace Microsoft.AspNetCore.StaticWebAssets.Tasks.Utils; internal static class HashingUtils { #if NET9_0_OR_GREATER public static byte[] ComputeHash(MemoryStream memoryStream, Span<string> values) #else public static byte[] ComputeHash(MemoryStream memoryStream, params string[] values) #endif { using var writer = CreateWriter(memoryStream); using var sha256 = SHA256.Create(); for (var i = 0; i < values.Length; i++) { writer.Write(values[i]); } writer.Flush(); memoryStream.Position = 0; return sha256.ComputeHash(memoryStream); } #if NET9_0_OR_GREATER public static byte[] ComputeHash(MemoryStream memoryStream, Span<ITaskItem> items, params Span<string> properties) #else public static byte[] ComputeHash(MemoryStream memoryStream, Span<ITaskItem> items, params string[] properties) #endif { using var writer = CreateWriter(memoryStream); using var sha256 = SHA256.Create(); for (var i = 0; i < items.Length; i++) { var item = items[i]; writer.Write(item.ItemSpec); for (var j = 0; j < properties.Length; j++) { writer.Write(item.GetMetadata(properties[j])); } } writer.Flush(); memoryStream.Position = 0; return sha256.ComputeHash(memoryStream); } internal static Dictionary<string, ITaskItem> ComputeHashLookup( MemoryStream memoryStream, ITaskItem[] candidateAssets, #if NET9_0_OR_GREATER Span<string> metadata) #else params string[] metadata) #endif { var hashSet = new Dictionary<string, ITaskItem>(candidateAssets.Length); for (var i = 0; i < candidateAssets.Length; i++) { var candidate = candidateAssets[i]; hashSet.Add(Convert.ToBase64String(ComputeHash(memoryStream, candidateAssets.AsSpan(i, 1), properties: metadata)), candidate); } return hashSet; } private static StreamWriter CreateWriter(MemoryStream memoryStream) { memoryStream.SetLength(0); #if NET9_0_OR_GREATER return new(memoryStream, encoding: Encoding.UTF8, leaveOpen: true); #else return new(memoryStream, Encoding.UTF8, 512, leaveOpen: true); #endif } }