From 4b8a9729eb17a3aee8df2eb6bf47c8cdc9d5f47d Mon Sep 17 00:00:00 2001 From: Pranav K Date: Wed, 20 Oct 2021 13:52:03 -0700 Subject: [PATCH 1/2] Continue using HashCodeCombiner in Razor.Language References by Razor.Language end up getting loaded in VS and the source generator --- ....Internal.SourceGenerator.Transport.csproj | 1 - .../src/AllowedChildTagDescriptorComparer.cs | 7 ++- .../src/BoundAttributeDescriptorComparer.cs | 13 ++-- ...undAttributeParameterDescriptorComparer.cs | 11 ++-- .../src/CodeGeneration/LinePragma.cs | 7 ++- .../src/DefaultRazorDiagnostic.cs | 5 +- .../src/DirectiveDescriptorComparer.cs | 7 ++- .../src/DirectiveTokenDescriptorComparer.cs | 7 ++- .../src/HashCodeCombiner.cs | 59 +++++++++++++++++++ .../src/Legacy/AddTagHelperChunkGenerator.cs | 13 ++-- .../src/Legacy/AutoCompleteEditHandler.cs | 7 ++- .../Legacy/DirectiveTokenChunkGenerator.cs | 7 ++- .../Legacy/ImplicitExpressionEditHandler.cs | 6 +- .../Legacy/LiteralAttributeChunkGenerator.cs | 9 ++- .../src/Legacy/LocationTagged.cs | 7 ++- .../Legacy/RemoveTagHelperChunkGenerator.cs | 13 ++-- .../TagHelperPrefixDirectiveChunkGenerator.cs | 9 +-- ...Microsoft.AspNetCore.Razor.Language.csproj | 4 -- .../src/RazorConfiguration.cs | 5 +- .../RequiredAttributeDescriptorComparer.cs | 9 +-- .../src/SourceChange.cs | 7 ++- .../src/SourceLocation.cs | 9 +-- .../src/SourceMapping.cs | 7 ++- .../src/SourceSpan.cs | 7 ++- .../src/StringSegment.cs | 1 + .../src/Syntax/ChildSyntaxList.cs | 6 +- .../src/Syntax/SyntaxTriviaList.cs | 6 +- .../src/Syntax/TextSpan.cs | 7 ++- .../src/TagHelperDescriptorComparer.cs | 21 +++---- .../src/TagMatchingRuleDescriptorComparer.cs | 9 +-- .../test/HashCodeCombinerTest.cs | 39 ++++++++++++ .../src/AssemblyIdentityEqualityComparer.cs | 7 ++- .../src/Microsoft.CodeAnalysis.Razor.csproj | 1 - 33 files changed, 247 insertions(+), 86 deletions(-) create mode 100644 src/Razor/Microsoft.AspNetCore.Razor.Language/src/HashCodeCombiner.cs create mode 100644 src/Razor/Microsoft.AspNetCore.Razor.Language/test/HashCodeCombinerTest.cs diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Internal.SourceGenerator.Transport/Microsoft.AspNetCore.Razor.Internal.SourceGenerator.Transport.csproj b/src/Razor/Microsoft.AspNetCore.Razor.Internal.SourceGenerator.Transport/Microsoft.AspNetCore.Razor.Internal.SourceGenerator.Transport.csproj index 5de359581e78..9347cb140728 100644 --- a/src/Razor/Microsoft.AspNetCore.Razor.Internal.SourceGenerator.Transport/Microsoft.AspNetCore.Razor.Internal.SourceGenerator.Transport.csproj +++ b/src/Razor/Microsoft.AspNetCore.Razor.Internal.SourceGenerator.Transport/Microsoft.AspNetCore.Razor.Internal.SourceGenerator.Transport.csproj @@ -30,7 +30,6 @@ - diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/AllowedChildTagDescriptorComparer.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/AllowedChildTagDescriptorComparer.cs index 62ac55aa45ab..d23fef4e026d 100644 --- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/AllowedChildTagDescriptorComparer.cs +++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/AllowedChildTagDescriptorComparer.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using Microsoft.Extensions.Internal; namespace Microsoft.AspNetCore.Razor.Language { @@ -41,10 +42,10 @@ public virtual bool Equals( /// public virtual int GetHashCode(AllowedChildTagDescriptor descriptor) { - var hash = new HashCode(); - hash.Add(descriptor.Name ?? string.Empty, StringComparer.Ordinal); + var hash = HashCodeCombiner.Start(); + hash.Add(descriptor.Name, StringComparer.Ordinal); - return hash.ToHashCode(); + return hash.CombinedHash; } } } diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/BoundAttributeDescriptorComparer.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/BoundAttributeDescriptorComparer.cs index 2ee4ccc9496b..bbf14ad2f344 100644 --- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/BoundAttributeDescriptorComparer.cs +++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/BoundAttributeDescriptorComparer.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.Linq; +using Microsoft.Extensions.Internal; namespace Microsoft.AspNetCore.Razor.Language { @@ -55,12 +56,12 @@ public int GetHashCode(BoundAttributeDescriptor descriptor) throw new ArgumentNullException(nameof(descriptor)); } - var hash = new HashCode(); - hash.Add(descriptor.Kind ?? string.Empty, StringComparer.Ordinal); - hash.Add(descriptor.Name ?? string.Empty, StringComparer.Ordinal); + var hash = HashCodeCombiner.Start(); + hash.Add(descriptor.Kind, StringComparer.Ordinal); + hash.Add(descriptor.Name, StringComparer.Ordinal); hash.Add(descriptor.IsEditorRequired); - hash.Add(descriptor.TypeName ?? string.Empty, StringComparer.Ordinal); - hash.Add(descriptor.Documentation ?? string.Empty, StringComparer.Ordinal); + hash.Add(descriptor.TypeName, StringComparer.Ordinal); + hash.Add(descriptor.Documentation, StringComparer.Ordinal); if (descriptor.BoundAttributeParameters != null) { @@ -88,7 +89,7 @@ public int GetHashCode(BoundAttributeDescriptor descriptor) } } - return hash.ToHashCode(); + return hash.CombinedHash; } } } diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/BoundAttributeParameterDescriptorComparer.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/BoundAttributeParameterDescriptorComparer.cs index 5e9244291f07..ace60ba9b178 100644 --- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/BoundAttributeParameterDescriptorComparer.cs +++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/BoundAttributeParameterDescriptorComparer.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.Linq; +using Microsoft.Extensions.Internal; namespace Microsoft.AspNetCore.Razor.Language { @@ -49,13 +50,13 @@ public virtual int GetHashCode(BoundAttributeParameterDescriptor descriptor) throw new ArgumentNullException(nameof(descriptor)); } - var hash = new HashCode(); - hash.Add(descriptor.Kind ?? string.Empty, StringComparer.Ordinal); - hash.Add(descriptor.Name ?? string.Empty, StringComparer.Ordinal); - hash.Add(descriptor.TypeName ?? string.Empty, StringComparer.Ordinal); + var hash = HashCodeCombiner.Start(); + hash.Add(descriptor.Kind, StringComparer.Ordinal); + hash.Add(descriptor.Name, StringComparer.Ordinal); + hash.Add(descriptor.TypeName, StringComparer.Ordinal); hash.Add(descriptor.Metadata?.Count); - return hash.ToHashCode(); + return hash.CombinedHash; } } } diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/CodeGeneration/LinePragma.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/CodeGeneration/LinePragma.cs index 2648768238fb..d85fb7fb29c0 100644 --- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/CodeGeneration/LinePragma.cs +++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/CodeGeneration/LinePragma.cs @@ -3,6 +3,7 @@ using System; using System.Globalization; +using Microsoft.Extensions.Internal; namespace Microsoft.AspNetCore.Razor.Language.CodeGeneration { @@ -61,7 +62,11 @@ public bool Equals(LinePragma other) public override int GetHashCode() { - return HashCode.Combine(StartLineIndex, LineCount, FilePath); + var hash = HashCodeCombiner.Start(); + hash.Add(StartLineIndex); + hash.Add(LineCount); + hash.Add(FilePath); + return hash; } public override string ToString() diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/DefaultRazorDiagnostic.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/DefaultRazorDiagnostic.cs index b4093737ac22..0d43161786ad 100644 --- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/DefaultRazorDiagnostic.cs +++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/DefaultRazorDiagnostic.cs @@ -2,6 +2,7 @@ // The .NET Foundation licenses this file to you under the MIT license. using System; +using Microsoft.Extensions.Internal; namespace Microsoft.AspNetCore.Razor.Language { @@ -68,7 +69,7 @@ public override bool Equals(RazorDiagnostic obj) public override int GetHashCode() { - var hash = new HashCode(); + var hash = new HashCodeCombiner(); hash.Add(Descriptor.GetHashCode()); hash.Add(Span.GetHashCode()); @@ -77,7 +78,7 @@ public override int GetHashCode() hash.Add(Args[i]); } - return hash.ToHashCode(); + return hash; } } } diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/DirectiveDescriptorComparer.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/DirectiveDescriptorComparer.cs index 67c954996af6..f248d476c28c 100644 --- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/DirectiveDescriptorComparer.cs +++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/DirectiveDescriptorComparer.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.Linq; +using Microsoft.Extensions.Internal; namespace Microsoft.AspNetCore.Razor.Language { @@ -38,8 +39,8 @@ public int GetHashCode(DirectiveDescriptor descriptor) throw new ArgumentNullException(nameof(descriptor)); } - var hash = new HashCode(); - hash.Add(descriptor.Directive ?? string.Empty, StringComparer.Ordinal); + var hash = HashCodeCombiner.Start(); + hash.Add(descriptor.Directive, StringComparer.Ordinal); hash.Add(descriptor.Kind); if (descriptor.Tokens != null) @@ -50,7 +51,7 @@ public int GetHashCode(DirectiveDescriptor descriptor) } } - return hash.ToHashCode(); + return hash.CombinedHash; } } } diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/DirectiveTokenDescriptorComparer.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/DirectiveTokenDescriptorComparer.cs index 6ea1f78b3234..21c46af440aa 100644 --- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/DirectiveTokenDescriptorComparer.cs +++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/DirectiveTokenDescriptorComparer.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using Microsoft.Extensions.Internal; namespace Microsoft.AspNetCore.Razor.Language { @@ -33,7 +34,11 @@ public int GetHashCode(DirectiveTokenDescriptor descriptor) throw new ArgumentNullException(nameof(descriptor)); } - return HashCode.Combine(descriptor.Kind, descriptor.Optional ? 1 : 0); + var hashCodeCombiner = HashCodeCombiner.Start(); + hashCodeCombiner.Add(descriptor.Kind); + hashCodeCombiner.Add(descriptor.Optional ? 1 : 0); + + return hashCodeCombiner.CombinedHash; } } } diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/HashCodeCombiner.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/HashCodeCombiner.cs new file mode 100644 index 000000000000..40bd228b4a18 --- /dev/null +++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/HashCodeCombiner.cs @@ -0,0 +1,59 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +#nullable enable + +using System.Collections; +using System.Collections.Generic; +using System.Runtime.CompilerServices; + +namespace Microsoft.Extensions.Internal +{ + internal struct HashCodeCombiner + { + private long _combinedHash64; + + public int CombinedHash + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get { return _combinedHash64.GetHashCode(); } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private HashCodeCombiner(long seed) + { + _combinedHash64 = seed; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static implicit operator int(HashCodeCombiner self) + { + return self.CombinedHash; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Add(int i) + { + _combinedHash64 = ((_combinedHash64 << 5) + _combinedHash64) ^ i; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Add(T? o) + { + Add(o?.GetHashCode() ?? 0); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Add(TValue value, IEqualityComparer comparer) + { + var hashCode = value != null ? comparer.GetHashCode(value) : 0; + Add(hashCode); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static HashCodeCombiner Start() + { + return new HashCodeCombiner(0x1505L); + } + } +} diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Legacy/AddTagHelperChunkGenerator.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Legacy/AddTagHelperChunkGenerator.cs index d2e6ad31c802..f5c21110589f 100644 --- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Legacy/AddTagHelperChunkGenerator.cs +++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Legacy/AddTagHelperChunkGenerator.cs @@ -5,6 +5,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; +using Microsoft.Extensions.Internal; namespace Microsoft.AspNetCore.Razor.Language.Legacy { @@ -49,14 +50,14 @@ public override bool Equals(object obj) /// public override int GetHashCode() { - var combiner = new HashCode(); + var combiner = HashCodeCombiner.Start(); combiner.Add(base.GetHashCode()); - combiner.Add(LookupText ?? string.Empty, StringComparer.Ordinal); - combiner.Add(DirectiveText ?? string.Empty, StringComparer.Ordinal); - combiner.Add(TypePattern ?? string.Empty, StringComparer.Ordinal); - combiner.Add(AssemblyName ?? string.Empty, StringComparer.Ordinal); + combiner.Add(LookupText, StringComparer.Ordinal); + combiner.Add(DirectiveText, StringComparer.Ordinal); + combiner.Add(TypePattern, StringComparer.Ordinal); + combiner.Add(AssemblyName, StringComparer.Ordinal); - return combiner.ToHashCode(); + return combiner.CombinedHash; } public override string ToString() diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Legacy/AutoCompleteEditHandler.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Legacy/AutoCompleteEditHandler.cs index a97acb57a1c3..099d597c3c32 100644 --- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Legacy/AutoCompleteEditHandler.cs +++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Legacy/AutoCompleteEditHandler.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using Microsoft.AspNetCore.Razor.Language.Syntax; +using Microsoft.Extensions.Internal; namespace Microsoft.AspNetCore.Razor.Language.Legacy { @@ -59,7 +60,11 @@ public override bool Equals(object obj) public override int GetHashCode() { // Hash code should include only immutable properties but Equals also checks the type. - return HashCode.Combine(TypeHashCode, AutoCompleteAtEndOfSpan); + var hashCodeCombiner = HashCodeCombiner.Start(); + hashCodeCombiner.Add(TypeHashCode); + hashCodeCombiner.Add(AutoCompleteAtEndOfSpan); + + return hashCodeCombiner.CombinedHash; } } } diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Legacy/DirectiveTokenChunkGenerator.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Legacy/DirectiveTokenChunkGenerator.cs index 6a0e637ce3ff..cfad3f519741 100644 --- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Legacy/DirectiveTokenChunkGenerator.cs +++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Legacy/DirectiveTokenChunkGenerator.cs @@ -3,6 +3,7 @@ using System; using System.Text; +using Microsoft.Extensions.Internal; namespace Microsoft.AspNetCore.Razor.Language.Legacy { @@ -26,7 +27,11 @@ public override bool Equals(object obj) public override int GetHashCode() { - return HashCode.Combine(base.GetHashCode(), Type); + var combiner = HashCodeCombiner.Start(); + combiner.Add(base.GetHashCode()); + combiner.Add(Type); + + return combiner.CombinedHash; } public override string ToString() diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Legacy/ImplicitExpressionEditHandler.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Legacy/ImplicitExpressionEditHandler.cs index d06767471a8b..5da6839c3107 100644 --- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Legacy/ImplicitExpressionEditHandler.cs +++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Legacy/ImplicitExpressionEditHandler.cs @@ -8,6 +8,7 @@ using System.IO; using System.Linq; using Microsoft.AspNetCore.Razor.Language.Syntax; +using Microsoft.Extensions.Internal; namespace Microsoft.AspNetCore.Razor.Language.Legacy { @@ -53,7 +54,10 @@ public override bool Equals(object obj) public override int GetHashCode() { // Hash code should include only immutable properties and base has none. - return HashCode.Combine(AcceptTrailingDot); + var hashCodeCombiner = HashCodeCombiner.Start(); + hashCodeCombiner.Add(AcceptTrailingDot); + + return hashCodeCombiner; } protected override PartialParseResultInternal CanAcceptChange(SyntaxNode target, SourceChange change) diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Legacy/LiteralAttributeChunkGenerator.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Legacy/LiteralAttributeChunkGenerator.cs index a0f41a6b5ded..aafadca37850 100644 --- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Legacy/LiteralAttributeChunkGenerator.cs +++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Legacy/LiteralAttributeChunkGenerator.cs @@ -1,8 +1,8 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -using System; using System.Globalization; +using Microsoft.Extensions.Internal; namespace Microsoft.AspNetCore.Razor.Language.Legacy { @@ -33,7 +33,12 @@ public override bool Equals(object obj) public override int GetHashCode() { - return HashCode.Combine(Prefix, Value); + var hashCodeCombiner = HashCodeCombiner.Start(); + + hashCodeCombiner.Add(Prefix); + hashCodeCombiner.Add(Value); + + return hashCodeCombiner; } } } diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Legacy/LocationTagged.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Legacy/LocationTagged.cs index 5e91dbcdca62..911e30a1f27a 100644 --- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Legacy/LocationTagged.cs +++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Legacy/LocationTagged.cs @@ -4,6 +4,7 @@ using System; using System.Diagnostics; using System.Globalization; +using Microsoft.Extensions.Internal; namespace Microsoft.AspNetCore.Razor.Language.Legacy { @@ -44,7 +45,11 @@ public override bool Equals(object obj) public override int GetHashCode() { - return HashCode.Combine(Location, Value); + var hashCodeCombiner = HashCodeCombiner.Start(); + hashCodeCombiner.Add(Location); + hashCodeCombiner.Add(Value); + + return hashCodeCombiner.CombinedHash; } public override string ToString() diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Legacy/RemoveTagHelperChunkGenerator.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Legacy/RemoveTagHelperChunkGenerator.cs index 45bedb76a553..d5bdab8956b2 100644 --- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Legacy/RemoveTagHelperChunkGenerator.cs +++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Legacy/RemoveTagHelperChunkGenerator.cs @@ -5,6 +5,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; +using Microsoft.Extensions.Internal; namespace Microsoft.AspNetCore.Razor.Language.Legacy { @@ -49,14 +50,14 @@ public override bool Equals(object obj) /// public override int GetHashCode() { - var combiner = new HashCode(); + var combiner = HashCodeCombiner.Start(); combiner.Add(base.GetHashCode()); - combiner.Add(LookupText ?? string.Empty, StringComparer.Ordinal); - combiner.Add(DirectiveText ?? string.Empty, StringComparer.Ordinal); - combiner.Add(TypePattern ?? string.Empty, StringComparer.Ordinal); - combiner.Add(AssemblyName ?? string.Empty, StringComparer.Ordinal); + combiner.Add(LookupText, StringComparer.Ordinal); + combiner.Add(DirectiveText, StringComparer.Ordinal); + combiner.Add(TypePattern, StringComparer.Ordinal); + combiner.Add(AssemblyName, StringComparer.Ordinal); - return combiner.ToHashCode(); + return combiner.CombinedHash; } public override string ToString() diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Legacy/TagHelperPrefixDirectiveChunkGenerator.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Legacy/TagHelperPrefixDirectiveChunkGenerator.cs index b9f764fc6580..c4c95eef6fec 100644 --- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Legacy/TagHelperPrefixDirectiveChunkGenerator.cs +++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Legacy/TagHelperPrefixDirectiveChunkGenerator.cs @@ -5,6 +5,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; +using Microsoft.Extensions.Internal; namespace Microsoft.AspNetCore.Razor.Language.Legacy { @@ -36,12 +37,12 @@ public override bool Equals(object obj) /// public override int GetHashCode() { - var combiner = new HashCode(); + var combiner = HashCodeCombiner.Start(); combiner.Add(base.GetHashCode()); - combiner.Add(Prefix ?? string.Empty, StringComparer.Ordinal); - combiner.Add(DirectiveText ?? string.Empty, StringComparer.Ordinal); + combiner.Add(Prefix, StringComparer.Ordinal); + combiner.Add(DirectiveText, StringComparer.Ordinal); - return combiner.ToHashCode(); + return combiner.CombinedHash; } public override string ToString() diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Microsoft.AspNetCore.Razor.Language.csproj b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Microsoft.AspNetCore.Razor.Language.csproj index 720bd57edee7..527d2cae4326 100644 --- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Microsoft.AspNetCore.Razor.Language.csproj +++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Microsoft.AspNetCore.Razor.Language.csproj @@ -8,8 +8,4 @@ false - - - - diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/RazorConfiguration.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/RazorConfiguration.cs index 38daf1f0154a..1955799fa39e 100644 --- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/RazorConfiguration.cs +++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/RazorConfiguration.cs @@ -5,6 +5,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading; +using Microsoft.Extensions.Internal; namespace Microsoft.AspNetCore.Razor.Language { @@ -93,7 +94,7 @@ public virtual bool Equals(RazorConfiguration other) public override int GetHashCode() { - var hash = new HashCode(); + var hash = new HashCodeCombiner(); hash.Add(LanguageVersion); hash.Add(ConfigurationName); @@ -102,7 +103,7 @@ public override int GetHashCode() hash.Add(Extensions[i].ExtensionName); } - return hash.ToHashCode(); + return hash; } private class DefaultRazorConfiguration : RazorConfiguration diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/RequiredAttributeDescriptorComparer.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/RequiredAttributeDescriptorComparer.cs index 59cfb80fe048..27ea3c8ac125 100644 --- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/RequiredAttributeDescriptorComparer.cs +++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/RequiredAttributeDescriptorComparer.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using Microsoft.Extensions.Internal; namespace Microsoft.AspNetCore.Razor.Language { @@ -54,11 +55,11 @@ public virtual int GetHashCode(RequiredAttributeDescriptor descriptor) throw new ArgumentNullException(nameof(descriptor)); } - var hash = new HashCode(); - hash.Add(descriptor.Name ?? string.Empty, StringComparer.Ordinal); - hash.Add(descriptor.Value ?? string.Empty, StringComparer.Ordinal); + var hash = HashCodeCombiner.Start(); + hash.Add(descriptor.Name, StringComparer.Ordinal); + hash.Add(descriptor.Value, StringComparer.Ordinal); - return hash.ToHashCode(); + return hash.CombinedHash; } } } diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/SourceChange.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/SourceChange.cs index da6431b81dc3..b4044874d41a 100644 --- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/SourceChange.cs +++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/SourceChange.cs @@ -4,6 +4,7 @@ using System; using Microsoft.AspNetCore.Razor.Language.Legacy; using Microsoft.AspNetCore.Razor.Language.Syntax; +using Microsoft.Extensions.Internal; namespace Microsoft.AspNetCore.Razor.Language { @@ -124,10 +125,10 @@ public override bool Equals(object obj) public override int GetHashCode() { - var hash = new HashCode(); + var hash = new HashCodeCombiner(); hash.Add(Span); - hash.Add(NewText ?? string.Empty, StringComparer.Ordinal); - return hash.ToHashCode(); + hash.Add(NewText, StringComparer.Ordinal); + return hash; } public override string ToString() diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/SourceLocation.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/SourceLocation.cs index 18ece35e437a..78500238e80e 100644 --- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/SourceLocation.cs +++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/SourceLocation.cs @@ -3,6 +3,7 @@ using System; using System.Globalization; +using Microsoft.Extensions.Internal; namespace Microsoft.AspNetCore.Razor.Language { @@ -105,11 +106,11 @@ public override bool Equals(object obj) /// public override int GetHashCode() { - var hashCode = new HashCode(); - hashCode.Add(FilePath ?? string.Empty, StringComparer.Ordinal); - hashCode.Add(AbsoluteIndex); + var hashCodeCombiner = HashCodeCombiner.Start(); + hashCodeCombiner.Add(FilePath, StringComparer.Ordinal); + hashCodeCombiner.Add(AbsoluteIndex); - return hashCode.ToHashCode(); + return hashCodeCombiner; } /// diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/SourceMapping.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/SourceMapping.cs index 3698f9d51117..a775f7bc7b63 100644 --- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/SourceMapping.cs +++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/SourceMapping.cs @@ -3,6 +3,7 @@ using System; using System.Globalization; +using Microsoft.Extensions.Internal; namespace Microsoft.AspNetCore.Razor.Language { @@ -37,7 +38,11 @@ public bool Equals(SourceMapping other) public override int GetHashCode() { - return HashCode.Combine(OriginalSpan, GeneratedSpan); + var hashCodeCombiner = HashCodeCombiner.Start(); + hashCodeCombiner.Add(OriginalSpan); + hashCodeCombiner.Add(GeneratedSpan); + + return hashCodeCombiner; } public override string ToString() diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/SourceSpan.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/SourceSpan.cs index 7580df94e8c2..68324c03d6db 100644 --- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/SourceSpan.cs +++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/SourceSpan.cs @@ -3,6 +3,7 @@ using System; using System.Globalization; +using Microsoft.Extensions.Internal; namespace Microsoft.AspNetCore.Razor.Language { @@ -72,14 +73,14 @@ public override bool Equals(object obj) public override int GetHashCode() { - var hash = new HashCode(); - hash.Add(FilePath ?? string.Empty, StringComparer.Ordinal); + var hash = HashCodeCombiner.Start(); + hash.Add(FilePath, StringComparer.Ordinal); hash.Add(AbsoluteIndex); hash.Add(LineIndex); hash.Add(CharacterIndex); hash.Add(Length); - return hash.ToHashCode(); + return hash; } public override string ToString() diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/StringSegment.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/StringSegment.cs index 88e9a678ca6b..b97c498f0953 100644 --- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/StringSegment.cs +++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/StringSegment.cs @@ -4,6 +4,7 @@ using System; using System.Diagnostics; using System.Runtime.CompilerServices; +using Microsoft.Extensions.Internal; namespace Microsoft.AspNetCore.Razor { diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Syntax/ChildSyntaxList.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Syntax/ChildSyntaxList.cs index ffaefb05b1da..fdff42f277e5 100644 --- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Syntax/ChildSyntaxList.cs +++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Syntax/ChildSyntaxList.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using System.Diagnostics; using System.Linq; +using Microsoft.Extensions.Internal; namespace Microsoft.AspNetCore.Razor.Language.Syntax { @@ -570,7 +571,10 @@ public override int GetHashCode() return 0; } - return HashCode.Combine(_node.GetHashCode(), _count); + var hash = HashCodeCombiner.Start(); + hash.Add(_node.GetHashCode()); + hash.Add(_count); + return hash.CombinedHash; } public override bool Equals(object obj) diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Syntax/SyntaxTriviaList.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Syntax/SyntaxTriviaList.cs index bf032cc492e9..e38470fabec9 100644 --- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Syntax/SyntaxTriviaList.cs +++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Syntax/SyntaxTriviaList.cs @@ -7,6 +7,7 @@ using System.Diagnostics; using System.Linq; using System.Runtime.InteropServices; +using Microsoft.Extensions.Internal; namespace Microsoft.AspNetCore.Razor.Language.Syntax { @@ -448,7 +449,10 @@ public override bool Equals(object obj) public override int GetHashCode() { - return HashCode.Combine(Node, Index); + var hash = HashCodeCombiner.Start(); + hash.Add(Node); + hash.Add(Index); + return hash.CombinedHash; } /// diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Syntax/TextSpan.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Syntax/TextSpan.cs index e18a4f9f58b9..0769dfd16dd5 100644 --- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Syntax/TextSpan.cs +++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Syntax/TextSpan.cs @@ -2,6 +2,7 @@ // The .NET Foundation licenses this file to you under the MIT license. using System; +using Microsoft.Extensions.Internal; namespace Microsoft.AspNetCore.Razor.Language.Syntax { @@ -228,7 +229,11 @@ public override bool Equals(object obj) /// public override int GetHashCode() { - return HashCode.Combine(Start, Length); + var combiner = new HashCodeCombiner(); + combiner.Add(Start); + combiner.Add(Length); + + return combiner.CombinedHash; } /// diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/TagHelperDescriptorComparer.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/TagHelperDescriptorComparer.cs index 048c8c8896a2..caad339ef70e 100644 --- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/TagHelperDescriptorComparer.cs +++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/TagHelperDescriptorComparer.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.Linq; +using Microsoft.Extensions.Internal; namespace Microsoft.AspNetCore.Razor.Language { @@ -115,11 +116,11 @@ public int GetHashCode(TagHelperDescriptor descriptor) throw new ArgumentNullException(nameof(descriptor)); } - var hash = new HashCode(); - hash.Add(descriptor.Kind ?? string.Empty, StringComparer.Ordinal); - hash.Add(descriptor.AssemblyName ?? string.Empty, StringComparer.Ordinal); - hash.Add(descriptor.Name ?? string.Empty, StringComparer.Ordinal); - hash.Add(descriptor.DisplayName ?? string.Empty, StringComparer.Ordinal); + var hash = HashCodeCombiner.Start(); + hash.Add(descriptor.Kind, StringComparer.Ordinal); + hash.Add(descriptor.AssemblyName, StringComparer.Ordinal); + hash.Add(descriptor.Name, StringComparer.Ordinal); + hash.Add(descriptor.DisplayName, StringComparer.Ordinal); hash.Add(descriptor.CaseSensitive ? 1 : 0); if (descriptor.BoundAttributes != null) @@ -161,21 +162,21 @@ public int GetHashCode(TagHelperDescriptor descriptor) { foreach (var kvp in metadata) { - hash.Add(kvp.Key ?? string.Empty, StringComparer.Ordinal); - hash.Add(kvp.Value ?? string.Empty, StringComparer.Ordinal); + hash.Add(kvp.Key, StringComparer.Ordinal); + hash.Add(kvp.Value, StringComparer.Ordinal); } } else { foreach (var kvp in descriptor.Metadata) { - hash.Add(kvp.Key ?? string.Empty, StringComparer.Ordinal); - hash.Add(kvp.Value ?? string.Empty, StringComparer.Ordinal); + hash.Add(kvp.Key, StringComparer.Ordinal); + hash.Add(kvp.Value, StringComparer.Ordinal); } } } - return hash.ToHashCode(); + return hash.CombinedHash; } } } diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/TagMatchingRuleDescriptorComparer.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/TagMatchingRuleDescriptorComparer.cs index 05b16bc141f4..b711b580db02 100644 --- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/TagMatchingRuleDescriptorComparer.cs +++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/TagMatchingRuleDescriptorComparer.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.Linq; +using Microsoft.Extensions.Internal; namespace Microsoft.AspNetCore.Razor.Language { @@ -45,9 +46,9 @@ public virtual int GetHashCode(TagMatchingRuleDescriptor rule) throw new ArgumentNullException(nameof(rule)); } - var hash = new HashCode(); - hash.Add(rule.TagName ?? string.Empty, StringComparer.Ordinal); - hash.Add(rule.ParentTag ?? string.Empty, StringComparer.Ordinal); + var hash = HashCodeCombiner.Start(); + hash.Add(rule.TagName, StringComparer.Ordinal); + hash.Add(rule.ParentTag, StringComparer.Ordinal); if (rule.Attributes != null) { @@ -57,7 +58,7 @@ public virtual int GetHashCode(TagMatchingRuleDescriptor rule) } } - return hash.ToHashCode(); + return hash.CombinedHash; } } } diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/test/HashCodeCombinerTest.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/test/HashCodeCombinerTest.cs new file mode 100644 index 000000000000..68ec1c5108d3 --- /dev/null +++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/test/HashCodeCombinerTest.cs @@ -0,0 +1,39 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using Xunit; + +namespace Microsoft.Extensions.Internal +{ + public class HashCodeCombinerTest + { + [Fact] + public void GivenTheSameInputs_ItProducesTheSameOutput() + { + var hashCode1 = new HashCodeCombiner(); + var hashCode2 = new HashCodeCombiner(); + + hashCode1.Add(42); + hashCode1.Add("foo"); + hashCode2.Add(42); + hashCode2.Add("foo"); + + Assert.Equal(hashCode1.CombinedHash, hashCode2.CombinedHash); + } + + [Fact] + public void HashCode_Is_OrderSensitive() + { + var hashCode1 = HashCodeCombiner.Start(); + var hashCode2 = HashCodeCombiner.Start(); + + hashCode1.Add(42); + hashCode1.Add("foo"); + + hashCode2.Add("foo"); + hashCode2.Add(42); + + Assert.NotEqual(hashCode1.CombinedHash, hashCode2.CombinedHash); + } + } +} diff --git a/src/Razor/Microsoft.CodeAnalysis.Razor/src/AssemblyIdentityEqualityComparer.cs b/src/Razor/Microsoft.CodeAnalysis.Razor/src/AssemblyIdentityEqualityComparer.cs index 042dab55098f..e9f237230378 100644 --- a/src/Razor/Microsoft.CodeAnalysis.Razor/src/AssemblyIdentityEqualityComparer.cs +++ b/src/Razor/Microsoft.CodeAnalysis.Razor/src/AssemblyIdentityEqualityComparer.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using Microsoft.Extensions.Internal; namespace Microsoft.CodeAnalysis.Razor { @@ -39,10 +40,10 @@ public override int GetHashCode(AssemblyIdentity obj) return 0; } - var hash = new HashCode(); - hash.Add(obj.Name ?? string.Empty, StringComparer.OrdinalIgnoreCase); + var hash = new HashCodeCombiner(); + hash.Add(obj.Name, StringComparer.OrdinalIgnoreCase); hash.Add(obj.Version); - return hash.ToHashCode(); + return hash; } } } diff --git a/src/Razor/Microsoft.CodeAnalysis.Razor/src/Microsoft.CodeAnalysis.Razor.csproj b/src/Razor/Microsoft.CodeAnalysis.Razor/src/Microsoft.CodeAnalysis.Razor.csproj index ee62e1a7b545..b158473bde4f 100644 --- a/src/Razor/Microsoft.CodeAnalysis.Razor/src/Microsoft.CodeAnalysis.Razor.csproj +++ b/src/Razor/Microsoft.CodeAnalysis.Razor/src/Microsoft.CodeAnalysis.Razor.csproj @@ -12,6 +12,5 @@ - From c5630b092fdccde030313e6ecc421419fd7be819 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Thu, 21 Oct 2021 14:30:04 -0700 Subject: [PATCH 2/2] Use HashCodeCombiner.Start --- .../src/DefaultRazorDiagnostic.cs | 4 ++-- .../src/RazorConfiguration.cs | 2 +- .../Microsoft.AspNetCore.Razor.Language/src/SourceChange.cs | 2 +- .../src/Syntax/TextSpan.cs | 2 +- .../test/HashCodeCombinerTest.cs | 4 ++-- .../src/AssemblyIdentityEqualityComparer.cs | 4 ++-- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/DefaultRazorDiagnostic.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/DefaultRazorDiagnostic.cs index 0d43161786ad..6e20b1febfbf 100644 --- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/DefaultRazorDiagnostic.cs +++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/DefaultRazorDiagnostic.cs @@ -1,4 +1,4 @@ -// Licensed to the .NET Foundation under one or more agreements. +// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System; @@ -69,7 +69,7 @@ public override bool Equals(RazorDiagnostic obj) public override int GetHashCode() { - var hash = new HashCodeCombiner(); + var hash = HashCodeCombiner.Start(); hash.Add(Descriptor.GetHashCode()); hash.Add(Span.GetHashCode()); diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/RazorConfiguration.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/RazorConfiguration.cs index 1955799fa39e..ff83b7b6e7cf 100644 --- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/RazorConfiguration.cs +++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/RazorConfiguration.cs @@ -94,7 +94,7 @@ public virtual bool Equals(RazorConfiguration other) public override int GetHashCode() { - var hash = new HashCodeCombiner(); + var hash = HashCodeCombiner.Start(); hash.Add(LanguageVersion); hash.Add(ConfigurationName); diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/SourceChange.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/SourceChange.cs index b4044874d41a..ed62081ceb3a 100644 --- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/SourceChange.cs +++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/SourceChange.cs @@ -125,7 +125,7 @@ public override bool Equals(object obj) public override int GetHashCode() { - var hash = new HashCodeCombiner(); + var hash = HashCodeCombiner.Start(); hash.Add(Span); hash.Add(NewText, StringComparer.Ordinal); return hash; diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Syntax/TextSpan.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Syntax/TextSpan.cs index 0769dfd16dd5..89da86a82ca1 100644 --- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Syntax/TextSpan.cs +++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Syntax/TextSpan.cs @@ -229,7 +229,7 @@ public override bool Equals(object obj) /// public override int GetHashCode() { - var combiner = new HashCodeCombiner(); + var combiner = HashCodeCombiner.Start(); combiner.Add(Start); combiner.Add(Length); diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/test/HashCodeCombinerTest.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/test/HashCodeCombinerTest.cs index 68ec1c5108d3..9bb7c0820ebd 100644 --- a/src/Razor/Microsoft.AspNetCore.Razor.Language/test/HashCodeCombinerTest.cs +++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/test/HashCodeCombinerTest.cs @@ -10,8 +10,8 @@ public class HashCodeCombinerTest [Fact] public void GivenTheSameInputs_ItProducesTheSameOutput() { - var hashCode1 = new HashCodeCombiner(); - var hashCode2 = new HashCodeCombiner(); + var hashCode1 = HashCodeCombiner.Start(); + var hashCode2 = HashCodeCombiner.Start(); hashCode1.Add(42); hashCode1.Add("foo"); diff --git a/src/Razor/Microsoft.CodeAnalysis.Razor/src/AssemblyIdentityEqualityComparer.cs b/src/Razor/Microsoft.CodeAnalysis.Razor/src/AssemblyIdentityEqualityComparer.cs index e9f237230378..de60d10371f2 100644 --- a/src/Razor/Microsoft.CodeAnalysis.Razor/src/AssemblyIdentityEqualityComparer.cs +++ b/src/Razor/Microsoft.CodeAnalysis.Razor/src/AssemblyIdentityEqualityComparer.cs @@ -1,4 +1,4 @@ -// Licensed to the .NET Foundation under one or more agreements. +// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System; @@ -40,7 +40,7 @@ public override int GetHashCode(AssemblyIdentity obj) return 0; } - var hash = new HashCodeCombiner(); + var hash = HashCodeCombiner.Start(); hash.Add(obj.Name, StringComparer.OrdinalIgnoreCase); hash.Add(obj.Version); return hash;