Skip to content

Commit 0ca8ae3

Browse files
Use SHA512.HashDataAsync
Use `SHA512.HashDataAsync()` for .NET 8 to reduce allocations.
1 parent e4f5045 commit 0ca8ae3

File tree

1 file changed

+24
-7
lines changed

1 file changed

+24
-7
lines changed

src/Microsoft.OpenApi/Models/OpenApiDocument.cs

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -524,20 +524,37 @@ public void SetReferenceHostDocument()
524524
/// <returns>The hash value.</returns>
525525
public async Task<string> GetHashCodeAsync(CancellationToken cancellationToken = default)
526526
{
527+
byte[]? hash;
528+
529+
#if NET
530+
using var memoryStream = new MemoryStream();
531+
using var streamWriter = new StreamWriter(memoryStream);
532+
533+
await WriteDocumentAsync(streamWriter, cancellationToken).ConfigureAwait(false);
534+
535+
memoryStream.Seek(0, SeekOrigin.Begin);
536+
537+
hash = await SHA512.HashDataAsync(memoryStream, cancellationToken).ConfigureAwait(false);
538+
#else
527539
using HashAlgorithm sha = SHA512.Create();
528540
using var cryptoStream = new CryptoStream(Stream.Null, sha, CryptoStreamMode.Write);
529541
using var streamWriter = new StreamWriter(cryptoStream);
530542

531-
var openApiJsonWriter = new OpenApiJsonWriter(streamWriter, new() { Terse = true });
532-
SerializeAsV3(openApiJsonWriter);
533-
await openApiJsonWriter.FlushAsync(cancellationToken).ConfigureAwait(false);
543+
await WriteDocumentAsync(streamWriter, cancellationToken).ConfigureAwait(false);
534544

535-
#if NET5_0_OR_GREATER
536-
await cryptoStream.FlushFinalBlockAsync(cancellationToken).ConfigureAwait(false);
537-
#else
538545
cryptoStream.FlushFinalBlock();
546+
547+
hash = sha.Hash;
539548
#endif
540-
return ConvertByteArrayToString(sha.Hash ?? []);
549+
550+
return ConvertByteArrayToString(hash ?? []);
551+
552+
async Task WriteDocumentAsync(TextWriter writer, CancellationToken token)
553+
{
554+
var openApiJsonWriter = new OpenApiJsonWriter(writer, new() { Terse = true });
555+
SerializeAsV3(openApiJsonWriter);
556+
await openApiJsonWriter.FlushAsync(cancellationToken).ConfigureAwait(false);
557+
}
541558
}
542559

543560
private static string ConvertByteArrayToString(byte[] hash)

0 commit comments

Comments
 (0)