From d41d8008eaa5dd7b697e2d413332b8d8d05f1500 Mon Sep 17 00:00:00 2001 From: Sergei Pavlov Date: Tue, 17 Sep 2024 20:53:51 -0700 Subject: [PATCH] Implement `GetHashCode()` via `HashCode.Combine()` --- .../Xtensive.Orm.Security/Permission.cs | 11 +------- .../Caching/CachePerformanceTest.cs | 7 ++--- .../Caching/WeakestCacheTest.cs | 7 ++--- .../Modelling/IndexingModel/TypeInfo.cs | 16 ++--------- Orm/Xtensive.Orm.Tests.Framework/Dynamic.cs | 13 +++++---- .../Linq/LocalCollectionsTest.cs | 24 +++-------------- Orm/Xtensive.Orm/Annotations.cs | 7 ++--- .../Arithmetic/ArithmeticRules.cs | 5 +--- Orm/Xtensive.Orm/Caching/WeakestCache.cs | 5 +--- .../Collections/FlagCollection.cs | 9 ++----- .../Collections/TypeRegistration.cs | 12 ++------- Orm/Xtensive.Orm/Comparison/ComparisonRule.cs | 10 ++----- .../Comparison/ComparisonRules.cs | 22 ++++++++------- .../Internals/NoSystemComparerHandler.cs | 6 ++--- Orm/Xtensive.Orm/Conversion/Biconverter.cs | 7 +---- .../Core/HasVersion{TValue,TVersion}.cs | 11 ++------ Orm/Xtensive.Orm/Core/Pair{TFirst,TSecond}.cs | 7 +---- Orm/Xtensive.Orm/Core/Pair{T}.cs | 9 +------ Orm/Xtensive.Orm/Core/Segment.cs | 9 ++----- .../Internals/ExpressionHashCodeCalculator.cs | 27 ++++++++++--------- .../Builders/DatabaseDependencyBuilder.cs | 9 ++----- .../Builders/StorageMappingBuilder.cs | 9 ++----- .../Orm/Building/DependencyGraph/Edge.cs | 7 +---- .../SessionConfigurationCollection.cs | 13 ++------- Orm/Xtensive.Orm/Orm/ConnectionInfo.cs | 12 ++------- Orm/Xtensive.Orm/Orm/EntityState.cs | 7 ++--- .../Orm/Internals/Prefetch/EntitySetTask.cs | 5 +--- .../Orm/Internals/Prefetch/GraphContainer.cs | 7 ++--- .../Orm/Internals/Prefetch/Nodes/Node.cs | 7 ++--- .../Orm/Internals/Prefetch/PrefetchManager.cs | 4 +-- .../MemberCompilerProvider.cs | 8 ++---- Orm/Xtensive.Orm/Orm/Model/ColumnInfo.cs | 5 +--- Orm/Xtensive.Orm/Orm/Model/IndexInfoRef.cs | 11 ++------ Orm/Xtensive.Orm/Orm/Model/KeyField.cs | 7 ++--- .../Expressions/QueryParameterIdentity.cs | 13 ++------- .../Requests/PersistRequestBuilderTask.cs | 13 +++------ Orm/Xtensive.Orm/Orm/Rse/Column.cs | 7 ++--- Orm/Xtensive.Orm/Orm/Structure.cs | 7 ++--- .../Orm/Upgrade/Hints/ChangeFieldTypeHint.cs | 12 ++------- .../Orm/Upgrade/Hints/CopyFieldHint.cs | 14 ++-------- .../Orm/Upgrade/Hints/MergeTypeHint.cs | 12 ++------- .../Orm/Upgrade/Hints/MoveFieldHint.cs | 14 ++-------- .../Orm/Upgrade/Hints/RecycledTypeHint.cs | 11 ++------ .../Orm/Upgrade/Hints/RemoveFieldHint.cs | 12 ++------- .../Orm/Upgrade/Hints/RemoveTypeHint.cs | 11 ++------ .../Orm/Upgrade/Hints/RenameFieldHint.cs | 13 ++------- .../Orm/Upgrade/Hints/RenameTypeHint.cs | 12 ++------- .../Orm/Upgrade/Hints/UpgradeHint.cs | 5 +--- .../Upgrade/Model/PartialIndexFilterInfo.cs | 7 ++--- .../Orm/Upgrade/Model/StorageTypeInfo.cs | 15 +---------- Orm/Xtensive.Orm/Orm/UrlInfo.cs | 7 ++--- .../Sql/Dml/SqlCustomFunctionType.cs | 5 +--- .../Transform/WrappingTransformTupleBase.cs | 7 ++--- Weaver/Xtensive.Orm.Weaver/TypeIdentity.cs | 13 +++------ 54 files changed, 128 insertions(+), 417 deletions(-) diff --git a/Extensions/Xtensive.Orm.Security/Permission.cs b/Extensions/Xtensive.Orm.Security/Permission.cs index 0766b62910..62edcbe321 100644 --- a/Extensions/Xtensive.Orm.Security/Permission.cs +++ b/Extensions/Xtensive.Orm.Security/Permission.cs @@ -56,16 +56,7 @@ public override bool Equals(object obj) } /// - public override int GetHashCode() - { - unchecked { - int result = (Type != null ? Type.GetHashCode() : 0); - result = (result*397) ^ CanRead.GetHashCode(); - result = (result*397) ^ CanWrite.GetHashCode(); - result = (result*397) ^ (Query != null ? Query.GetHashCode() : 0); - return result; - } - } + public override int GetHashCode() => HashCode.Combine(Type, CanRead, CanWrite, Query); #endregion diff --git a/Orm/Xtensive.Orm.Tests.Core/Caching/CachePerformanceTest.cs b/Orm/Xtensive.Orm.Tests.Core/Caching/CachePerformanceTest.cs index ffba35c3ef..854ad632d8 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Caching/CachePerformanceTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Caching/CachePerformanceTest.cs @@ -52,10 +52,7 @@ public override bool Equals(object obj) return Equals(obj as Item); } - public override int GetHashCode() - { - return (Value!=null ? Value.GetHashCode() : 0); - } + public override int GetHashCode() => Value?.GetHashCode() ?? 0; public override string ToString() { @@ -174,4 +171,4 @@ private void FetchTest(int count) } } } -} \ No newline at end of file +} diff --git a/Orm/Xtensive.Orm.Tests.Core/Caching/WeakestCacheTest.cs b/Orm/Xtensive.Orm.Tests.Core/Caching/WeakestCacheTest.cs index 28b7f48f9f..9617c47533 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Caching/WeakestCacheTest.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Caching/WeakestCacheTest.cs @@ -36,10 +36,7 @@ public override bool Equals(object obj) return Equals(obj as Item); } - public override int GetHashCode() - { - return (Value != null ? Value.GetHashCode() : 0); - } + public override int GetHashCode() => Value?.GetHashCode() ?? 0; public override string ToString() { @@ -197,4 +194,4 @@ public void ProfileTest() } } } -} \ No newline at end of file +} diff --git a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/TypeInfo.cs b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/TypeInfo.cs index 4354074352..03abfe87c4 100644 --- a/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/TypeInfo.cs +++ b/Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/TypeInfo.cs @@ -100,19 +100,7 @@ public override bool Equals(object obj) } /// - public override int GetHashCode() - { - unchecked { - int result = (Type!=null ? Type.GetHashCode() : 0); - result = (result * 397) ^ (IsNullable ? 1 : 0); - result = (result * 397) ^ Length; - result = (result * 397) ^ Scale; - result = (result * 397) ^ Precision; - if (Culture!=null) - result = (result * 397) ^ Culture.GetHashCode(); - return result; - } - } + public override int GetHashCode() => HashCode.Combine(Type, IsNullable, Length, Scale, Precision, Culture); /// /// Implements the operator ==. @@ -216,4 +204,4 @@ public TypeInfo(Type type, bool isNullable, int length, int scale, int precision Precision = precision; } } -} \ No newline at end of file +} diff --git a/Orm/Xtensive.Orm.Tests.Framework/Dynamic.cs b/Orm/Xtensive.Orm.Tests.Framework/Dynamic.cs index d879610172..1b943fef94 100644 --- a/Orm/Xtensive.Orm.Tests.Framework/Dynamic.cs +++ b/Orm/Xtensive.Orm.Tests.Framework/Dynamic.cs @@ -219,11 +219,13 @@ internal class Signature : IEquatable public Signature(IEnumerable properties) { this.properties = properties.ToArray(); - hashCode = 0; + HashCode hc = new(); foreach (DynamicProperty p in properties) { - hashCode ^= p.Name.GetHashCode() ^ p.Type.GetHashCode(); + hc.Add(p.Name); + hc.Add(p.Type); } + hashCode = hc.ToHashCode(); } #region IEquatable Members @@ -241,10 +243,7 @@ public bool Equals(Signature other) #endregion - public override int GetHashCode() - { - return hashCode; - } + public override int GetHashCode() => hashCode; public override bool Equals(object obj) { @@ -2298,4 +2297,4 @@ internal static class Res public const string CloseBracketOrCommaExpected = "']' or ',' expected"; public const string IdentifierExpected = "Identifier expected"; } -} \ No newline at end of file +} diff --git a/Orm/Xtensive.Orm.Tests/Linq/LocalCollectionsTest.cs b/Orm/Xtensive.Orm.Tests/Linq/LocalCollectionsTest.cs index 1aaca199b2..155ed8db18 100644 --- a/Orm/Xtensive.Orm.Tests/Linq/LocalCollectionsTest.cs +++ b/Orm/Xtensive.Orm.Tests/Linq/LocalCollectionsTest.cs @@ -54,10 +54,7 @@ public override bool Equals(object obj) return Equals((Poco) obj); } - public override int GetHashCode() - { - return Value.GetHashCode(); - } + public override int GetHashCode() => Value.GetHashCode(); } public class Poco @@ -85,12 +82,7 @@ public override bool Equals(object obj) return Equals((Poco) obj); } - public override int GetHashCode() - { - unchecked { - return (Value1.GetHashCode() * 397) ^ Value2.GetHashCode(); - } - } + public override int GetHashCode() => HashCode.Combine(Value1, Value2); public Poco(T1 Value1, T2 Value2) { @@ -137,15 +129,7 @@ public override bool Equals(object obj) return Equals((Poco) obj); } - public override int GetHashCode() - { - unchecked { - int result = Value1.GetHashCode(); - result = (result * 397) ^ Value2.GetHashCode(); - result = (result * 397) ^ Value3.GetHashCode(); - return result; - } - } + public override int GetHashCode() => HashCode.Combine(Value1, Value2, Value3); public Poco() { @@ -942,4 +926,4 @@ private IEnumerable> GetLocalItems(int count) .ToList(); } } -} \ No newline at end of file +} diff --git a/Orm/Xtensive.Orm/Annotations.cs b/Orm/Xtensive.Orm/Annotations.cs index 234591ee70..4b185a1b5a 100644 --- a/Orm/Xtensive.Orm/Annotations.cs +++ b/Orm/Xtensive.Orm/Annotations.cs @@ -75,10 +75,7 @@ public override bool Equals(object obj) /// Returns the hash code for this instance. /// /// A hash code for the current . - public override int GetHashCode() - { - return base.GetHashCode(); - } + public override int GetHashCode() => base.GetHashCode(); } /// @@ -521,4 +518,4 @@ public PathReferenceAttribute([PathReference] string basePath) [UsedImplicitly] public string BasePath { get; private set; } } -} \ No newline at end of file +} diff --git a/Orm/Xtensive.Orm/Arithmetic/ArithmeticRules.cs b/Orm/Xtensive.Orm/Arithmetic/ArithmeticRules.cs index 020f3759ca..80e4d3baf1 100644 --- a/Orm/Xtensive.Orm/Arithmetic/ArithmeticRules.cs +++ b/Orm/Xtensive.Orm/Arithmetic/ArithmeticRules.cs @@ -45,10 +45,7 @@ public override bool Equals(object obj) => obj is ArithmeticRules other && Equals(other); /// - public override int GetHashCode() - { - return ((byte)overflowBehavior << 8) | (byte)nullBehavior; - } + public override int GetHashCode() => ((byte) overflowBehavior << 8) | (byte) nullBehavior; // Constructors diff --git a/Orm/Xtensive.Orm/Caching/WeakestCache.cs b/Orm/Xtensive.Orm/Caching/WeakestCache.cs index f544c16498..4d6e30b266 100644 --- a/Orm/Xtensive.Orm/Caching/WeakestCache.cs +++ b/Orm/Xtensive.Orm/Caching/WeakestCache.cs @@ -101,10 +101,7 @@ public override bool Equals(object obj) return Equals((WeakEntry) obj); } - public override int GetHashCode() - { - return hashCode; - } + public override int GetHashCode() => hashCode; #endregion diff --git a/Orm/Xtensive.Orm/Collections/FlagCollection.cs b/Orm/Xtensive.Orm/Collections/FlagCollection.cs index 4c0948f4de..a81fedea30 100644 --- a/Orm/Xtensive.Orm/Collections/FlagCollection.cs +++ b/Orm/Xtensive.Orm/Collections/FlagCollection.cs @@ -333,12 +333,7 @@ public override bool Equals(object obj) } /// - public override int GetHashCode() - { - int result = keys.GetHashCode(); - result = 29*result + flags.GetHashCode(); - return result; - } + public override int GetHashCode() => HashCode.Combine(keys, flags); #endregion @@ -407,4 +402,4 @@ public virtual void GetObjectData(SerializationInfo info, StreamingContext conte #endregion } -} \ No newline at end of file +} diff --git a/Orm/Xtensive.Orm/Collections/TypeRegistration.cs b/Orm/Xtensive.Orm/Collections/TypeRegistration.cs index 0190877dec..221ef91087 100644 --- a/Orm/Xtensive.Orm/Collections/TypeRegistration.cs +++ b/Orm/Xtensive.Orm/Collections/TypeRegistration.cs @@ -69,15 +69,7 @@ public override bool Equals(object obj) } /// - public override int GetHashCode() - { - unchecked { - int result = (type!=null ? type.GetHashCode() : 0); - result = (result * 397) ^ (assembly!=null ? assembly.GetHashCode() : 0); - result = (result * 397) ^ (@namespace!=null ? @namespace.GetHashCode() : 0); - return result; - } - } + public override int GetHashCode() => HashCode.Combine(type, assembly, @namespace); /// public static bool operator ==(TypeRegistration left, TypeRegistration right) @@ -128,4 +120,4 @@ public TypeRegistration(Assembly assembly, string @namespace) this.@namespace = @namespace; } } -} \ No newline at end of file +} diff --git a/Orm/Xtensive.Orm/Comparison/ComparisonRule.cs b/Orm/Xtensive.Orm/Comparison/ComparisonRule.cs index 4c11ba5900..d51a15714e 100644 --- a/Orm/Xtensive.Orm/Comparison/ComparisonRule.cs +++ b/Orm/Xtensive.Orm/Comparison/ComparisonRule.cs @@ -83,13 +83,7 @@ public override bool Equals(object obj) => obj is ComparisonRule other && Equals(other); /// - public override int GetHashCode() - { - int result = (int)Direction; - if (Culture != null) - result ^= Culture.GetHashCode(); - return result; - } + public override int GetHashCode() => HashCode.Combine(Direction, Culture); #endregion @@ -200,4 +194,4 @@ void ISerializable.GetObjectData(SerializationInfo info, StreamingContext contex info.AddValue(nameof(Culture), cultureId); } } -} \ No newline at end of file +} diff --git a/Orm/Xtensive.Orm/Comparison/ComparisonRules.cs b/Orm/Xtensive.Orm/Comparison/ComparisonRules.cs index e8ba8f39ab..fed28d3cda 100644 --- a/Orm/Xtensive.Orm/Comparison/ComparisonRules.cs +++ b/Orm/Xtensive.Orm/Comparison/ComparisonRules.cs @@ -23,7 +23,7 @@ public sealed class ComparisonRules : { private readonly ComparisonRule value; private readonly ComparisonRules[] composite; - private volatile int cachedHashCode; + private long cachedHashCode; /// /// Predefined rules with = . @@ -199,18 +199,20 @@ public override bool Equals(object obj) => /// public override int GetHashCode() { - if (cachedHashCode==0) lock (composite) if (cachedHashCode==0) { + var h = Volatile.Read(ref cachedHashCode); + if (h == 0) { int tailIndex = TailIndex; - int result = value.GetHashCode(); - if (tailIndex==0 && IsRecursive) - result ^= 29 * 22; // Hash affection by IsRecursive + HashCode hc = new(); + hc.Add(value); + if (tailIndex == 0 && IsRecursive) + hc.Add(1); // Hash affection by IsRecursive else - result ^= 29 * composite[tailIndex].GetHashCode(); + hc.Add(composite[tailIndex]); for (int i = 0; i < tailIndex; i++) - result ^= (composite[i].GetHashCode() << i); - cachedHashCode = result; + hc.Add(composite[i]); + Volatile.Write(ref cachedHashCode, (long)hc.ToHashCode() | (1L << 63)); // Set the highest bit as HasValue flag even when `hashCode == 0` } - return cachedHashCode; + return (int) h; } #endregion @@ -313,4 +315,4 @@ private ComparisonRules(ComparisonRule value, ComparisonRules[] composite, bool this.composite = composite; } } -} \ No newline at end of file +} diff --git a/Orm/Xtensive.Orm/Comparison/Internals/NoSystemComparerHandler.cs b/Orm/Xtensive.Orm/Comparison/Internals/NoSystemComparerHandler.cs index 5322856c92..88a23a6dc7 100644 --- a/Orm/Xtensive.Orm/Comparison/Internals/NoSystemComparerHandler.cs +++ b/Orm/Xtensive.Orm/Comparison/Internals/NoSystemComparerHandler.cs @@ -36,13 +36,11 @@ public bool Equals(T other) } /// NotSupportedException. - public override int GetHashCode() - { + public override int GetHashCode() => throw new NotSupportedException(string.Format( Strings.ExTypeXMustImplementY, typeof(T).GetShortName(), typeof(IEquatable).GetShortName())); - } // Constructors @@ -51,4 +49,4 @@ private NoSystemComparerHandler() { } } -} \ No newline at end of file +} diff --git a/Orm/Xtensive.Orm/Conversion/Biconverter.cs b/Orm/Xtensive.Orm/Conversion/Biconverter.cs index 174512e7d1..0cc1eec4ad 100644 --- a/Orm/Xtensive.Orm/Conversion/Biconverter.cs +++ b/Orm/Xtensive.Orm/Conversion/Biconverter.cs @@ -57,12 +57,7 @@ public override bool Equals(object obj) => obj is Biconverter other && Equals(other); /// - public override int GetHashCode() - { - unchecked { - return ((ConvertForward!=null ? ConvertForward.GetHashCode() : 0) * 397) ^ (ConvertBackward!=null ? ConvertBackward.GetHashCode() : 0); - } - } + public override int GetHashCode() => HashCode.Combine(ConvertForward, ConvertBackward); #endregion diff --git a/Orm/Xtensive.Orm/Core/HasVersion{TValue,TVersion}.cs b/Orm/Xtensive.Orm/Core/HasVersion{TValue,TVersion}.cs index 630107db85..e857a3a180 100644 --- a/Orm/Xtensive.Orm/Core/HasVersion{TValue,TVersion}.cs +++ b/Orm/Xtensive.Orm/Core/HasVersion{TValue,TVersion}.cs @@ -61,14 +61,7 @@ public override bool Equals(object obj) => obj is HasVersion other && Equals(other); /// - public override int GetHashCode() - { - unchecked { - return - ((Value!=null ? Value.GetHashCode() : 0) * 397) ^ - (Version!=null ? Version.GetHashCode() : 0); - } - } + public override int GetHashCode() => HashCode.Combine(Value, Version); /// /// Checks specified objects for equality. @@ -114,4 +107,4 @@ public HasVersion(TValue value, TVersion version) Version = version; } } -} \ No newline at end of file +} diff --git a/Orm/Xtensive.Orm/Core/Pair{TFirst,TSecond}.cs b/Orm/Xtensive.Orm/Core/Pair{TFirst,TSecond}.cs index af240475fb..792a1fa8fd 100644 --- a/Orm/Xtensive.Orm/Core/Pair{TFirst,TSecond}.cs +++ b/Orm/Xtensive.Orm/Core/Pair{TFirst,TSecond}.cs @@ -57,12 +57,7 @@ public override bool Equals(object obj) => obj is Pair other && Equals(other); /// - public override int GetHashCode() - { - unchecked { - return ((First?.GetHashCode() ?? 0) * 397) ^ (Second?.GetHashCode() ?? 0); - } - } + public override int GetHashCode() => HashCode.Combine(First, Second); /// /// Checks specified objects for equality. diff --git a/Orm/Xtensive.Orm/Core/Pair{T}.cs b/Orm/Xtensive.Orm/Core/Pair{T}.cs index 5a5e785983..edbfd52909 100644 --- a/Orm/Xtensive.Orm/Core/Pair{T}.cs +++ b/Orm/Xtensive.Orm/Core/Pair{T}.cs @@ -58,14 +58,7 @@ public override bool Equals(object obj) => obj is Pair other && Equals(other); /// - public override int GetHashCode() - { - unchecked { - int result = (First!=null ? First.GetHashCode() : 0); - result = (result * 397) ^ (Second!=null ? Second.GetHashCode() : 0); - return result; - } - } + public override int GetHashCode() => HashCode.Combine(First, Second); /// /// Checks specified objects for equality. diff --git a/Orm/Xtensive.Orm/Core/Segment.cs b/Orm/Xtensive.Orm/Core/Segment.cs index a04902dcd6..78be3e5a54 100644 --- a/Orm/Xtensive.Orm/Core/Segment.cs +++ b/Orm/Xtensive.Orm/Core/Segment.cs @@ -66,12 +66,7 @@ public override bool Equals(object obj) => obj is Pair other && Equals(other); /// - public override int GetHashCode() - { - int firstHash = Offset == null ? 0 : Offset.GetHashCode(); - int secondHash = Length == null ? 0 : Length.GetHashCode(); - return firstHash ^ 29 * secondHash; - } + public override int GetHashCode() => HashCode.Combine(Offset, Length); #endregion @@ -119,4 +114,4 @@ public Segment(T offset, T length) Length = length; } } -} \ No newline at end of file +} diff --git a/Orm/Xtensive.Orm/Linq/Internals/ExpressionHashCodeCalculator.cs b/Orm/Xtensive.Orm/Linq/Internals/ExpressionHashCodeCalculator.cs index 4da105d2d3..54d78a5b39 100644 --- a/Orm/Xtensive.Orm/Linq/Internals/ExpressionHashCodeCalculator.cs +++ b/Orm/Xtensive.Orm/Linq/Internals/ExpressionHashCodeCalculator.cs @@ -86,10 +86,7 @@ protected override int VisitMemberAccess(MemberExpression m) return Visit(m.Expression) ^ m.Member.GetHashCode(); } - protected override int VisitMethodCall(MethodCallExpression mc) - { - return Visit(mc.Object) ^ mc.Method.GetHashCode() ^ HashExpressionSequence(mc.Arguments); - } + protected override int VisitMethodCall(MethodCallExpression mc) => HashCode.Combine(Visit(mc.Object), mc.Method, HashExpressionSequence(mc.Arguments)); protected override int VisitLambda(LambdaExpression l) { @@ -108,18 +105,24 @@ protected override int VisitNew(NewExpression n) protected override int VisitMemberInit(MemberInitExpression mi) { - var result = Visit(mi.NewExpression); - foreach (var b in mi.Bindings) - result ^= b.BindingType.GetHashCode() ^ b.Member.GetHashCode(); - return result; + HashCode hashCode = new(); + hashCode.Add(Visit(mi.NewExpression)); + foreach (var b in mi.Bindings) { + hashCode.Add(b.BindingType); + hashCode.Add(b.Member); + } + return hashCode.ToHashCode(); } protected override int VisitListInit(ListInitExpression li) { - var result = VisitNew(li.NewExpression); - foreach (var e in li.Initializers) - result ^= e.AddMethod.GetHashCode() ^ HashExpressionSequence(e.Arguments); - return result; + HashCode hashCode = new(); + hashCode.Add(VisitNew(li.NewExpression)); + foreach (var e in li.Initializers) { + hashCode.Add(e.AddMethod); + hashCode.Add(HashExpressionSequence(e.Arguments)); + } + return hashCode.ToHashCode(); } protected override int VisitNewArray(NewArrayExpression na) diff --git a/Orm/Xtensive.Orm/Orm/Building/Builders/DatabaseDependencyBuilder.cs b/Orm/Xtensive.Orm/Orm/Building/Builders/DatabaseDependencyBuilder.cs index 010e3cf277..79b4afe580 100644 --- a/Orm/Xtensive.Orm/Orm/Building/Builders/DatabaseDependencyBuilder.cs +++ b/Orm/Xtensive.Orm/Orm/Building/Builders/DatabaseDependencyBuilder.cs @@ -31,12 +31,7 @@ public bool Equals(DatabaseReference other) public override bool Equals(object obj) => obj is DatabaseReference other && Equals(other); - public override int GetHashCode() - { - unchecked { - return (TargetDatabase.GetHashCode() * 397) ^ OwnerDatabase.GetHashCode(); - } - } + public override int GetHashCode() => HashCode.Combine(TargetDatabase, OwnerDatabase); public static bool operator ==(DatabaseReference left, DatabaseReference right) { @@ -178,4 +173,4 @@ private DatabaseDependencyBuilder(BuildingContext context) configurationMap = context.Configuration.Databases.ToDictionary(db => db.Name); } } -} \ No newline at end of file +} diff --git a/Orm/Xtensive.Orm/Orm/Building/Builders/StorageMappingBuilder.cs b/Orm/Xtensive.Orm/Orm/Building/Builders/StorageMappingBuilder.cs index 9ad2d578e5..867af82e24 100644 --- a/Orm/Xtensive.Orm/Orm/Building/Builders/StorageMappingBuilder.cs +++ b/Orm/Xtensive.Orm/Orm/Building/Builders/StorageMappingBuilder.cs @@ -31,12 +31,7 @@ public bool Equals(MappingRequest other) public override bool Equals(object obj) => obj is MappingRequest other && Equals(other); - public override int GetHashCode() - { - unchecked { - return (Assembly.GetHashCode() * 397) ^ Namespace.GetHashCode(); - } - } + public override int GetHashCode() => HashCode.Combine(Assembly, Namespace); public static bool operator ==(MappingRequest left, MappingRequest right) { @@ -151,4 +146,4 @@ private StorageMappingBuilder(BuildingContext context) verbose = BuildLog.IsLogged(LogLevel.Info); } } -} \ No newline at end of file +} diff --git a/Orm/Xtensive.Orm/Orm/Building/DependencyGraph/Edge.cs b/Orm/Xtensive.Orm/Orm/Building/DependencyGraph/Edge.cs index 530e76fc4f..b748739f1f 100644 --- a/Orm/Xtensive.Orm/Orm/Building/DependencyGraph/Edge.cs +++ b/Orm/Xtensive.Orm/Orm/Building/DependencyGraph/Edge.cs @@ -20,12 +20,7 @@ namespace Xtensive.Orm.Building.DependencyGraph public EdgeWeight Weight { get; } /// - public override int GetHashCode() - { - unchecked { - return (Tail.GetHashCode() * 397) ^ Head.GetHashCode(); - } - } + public override int GetHashCode() => HashCode.Combine(Tail, Head); /// public bool Equals(Edge obj) => diff --git a/Orm/Xtensive.Orm/Orm/Configuration/SessionConfigurationCollection.cs b/Orm/Xtensive.Orm/Orm/Configuration/SessionConfigurationCollection.cs index ef7bc600ea..9d76c68e03 100644 --- a/Orm/Xtensive.Orm/Orm/Configuration/SessionConfigurationCollection.cs +++ b/Orm/Xtensive.Orm/Orm/Configuration/SessionConfigurationCollection.cs @@ -124,16 +124,7 @@ public bool Equals(SessionConfigurationCollection obj) } /// - public override int GetHashCode() - { - unchecked { - int result = (Default!=null ? Default.GetHashCode() : 0); - result = (result * 397) ^ (System!=null ? System.GetHashCode() : 0); - result = (result * 397) ^ (Service!=null ? Service.GetHashCode() : 0); - result = (result * 397) ^ (KeyGenerator!=null ? KeyGenerator.GetHashCode() : 0); - return result; - } - } + public override int GetHashCode() => HashCode.Combine(Default, System, Service, KeyGenerator); #endregion @@ -176,4 +167,4 @@ private SessionConfiguration BuildConfiguration(string name) return result; } } -} \ No newline at end of file +} diff --git a/Orm/Xtensive.Orm/Orm/ConnectionInfo.cs b/Orm/Xtensive.Orm/Orm/ConnectionInfo.cs index e0ccc97652..d182303042 100644 --- a/Orm/Xtensive.Orm/Orm/ConnectionInfo.cs +++ b/Orm/Xtensive.Orm/Orm/ConnectionInfo.cs @@ -45,15 +45,7 @@ public override string ToString() #region GetHashCode, Equals, ==, != /// - public override int GetHashCode() - { - unchecked { - int result = (Provider!=null ? Provider.GetHashCode() : 0); - result = (result * 397) ^ (ConnectionString!=null ? ConnectionString.GetHashCode() : 0); - result = (result * 397) ^ (ConnectionUrl!=null ? ConnectionUrl.GetHashCode() : 0); - return result; - } - } + public override int GetHashCode() => HashCode.Combine(Provider, ConnectionString, ConnectionUrl); /// public override bool Equals(object obj) @@ -129,4 +121,4 @@ public ConnectionInfo(string connectionUrl) { } } -} \ No newline at end of file +} diff --git a/Orm/Xtensive.Orm/Orm/EntityState.cs b/Orm/Xtensive.Orm/Orm/EntityState.cs index 6c83167a45..3e09d1e70c 100644 --- a/Orm/Xtensive.Orm/Orm/EntityState.cs +++ b/Orm/Xtensive.Orm/Orm/EntityState.cs @@ -304,10 +304,7 @@ public override bool Equals(object obj) } /// - public override int GetHashCode() - { - return Key.GetHashCode(); - } + public override int GetHashCode() => Key.GetHashCode(); /// public bool Equals(EntityState other) @@ -341,4 +338,4 @@ internal EntityState(Session session, Key key, Tuple data, bool isStale) IsStale = isStale; } } -} \ No newline at end of file +} diff --git a/Orm/Xtensive.Orm/Orm/Internals/Prefetch/EntitySetTask.cs b/Orm/Xtensive.Orm/Orm/Internals/Prefetch/EntitySetTask.cs index a061cea5b9..a2bb79a7d9 100644 --- a/Orm/Xtensive.Orm/Orm/Internals/Prefetch/EntitySetTask.cs +++ b/Orm/Xtensive.Orm/Orm/Internals/Prefetch/EntitySetTask.cs @@ -42,10 +42,7 @@ public ItemsQueryCacheKey(FieldInfo referencingField, int? itemCountLimit) { ReferencingField = referencingField; ItemCountLimit = itemCountLimit; - unchecked { - cachedHashCode = (ReferencingField.GetHashCode() * 397) - ^ (ItemCountLimit.HasValue ? 1 : 0); - } + cachedHashCode = HashCode.Combine(ReferencingField, ItemCountLimit.HasValue); } } diff --git a/Orm/Xtensive.Orm/Orm/Internals/Prefetch/GraphContainer.cs b/Orm/Xtensive.Orm/Orm/Internals/Prefetch/GraphContainer.cs index 2018137553..f9b14ce138 100644 --- a/Orm/Xtensive.Orm/Orm/Internals/Prefetch/GraphContainer.cs +++ b/Orm/Xtensive.Orm/Orm/Internals/Prefetch/GraphContainer.cs @@ -115,10 +115,7 @@ public override bool Equals(object obj) => public override int GetHashCode() { - if (cachedHashCode == null) - unchecked { - cachedHashCode = (Key.GetHashCode() * 397) ^ Type.GetHashCode(); - } + cachedHashCode ??= HashCode.Combine(Key, Type); return cachedHashCode.Value; } @@ -197,4 +194,4 @@ public GraphContainer(Key key, TypeInfo type, bool exactType, PrefetchManager ma this.exactType = exactType; } } -} \ No newline at end of file +} diff --git a/Orm/Xtensive.Orm/Orm/Internals/Prefetch/Nodes/Node.cs b/Orm/Xtensive.Orm/Orm/Internals/Prefetch/Nodes/Node.cs index 932ad290c1..dde960d8a1 100644 --- a/Orm/Xtensive.Orm/Orm/Internals/Prefetch/Nodes/Node.cs +++ b/Orm/Xtensive.Orm/Orm/Internals/Prefetch/Nodes/Node.cs @@ -35,10 +35,7 @@ public override bool Equals(object obj) return Equals(obj as Node); } - public override int GetHashCode() - { - return Path.GetHashCode(); - } + public override int GetHashCode() => Path.GetHashCode(); public override string ToString() { @@ -70,4 +67,4 @@ protected Node(string path) Path = path; } } -} \ No newline at end of file +} diff --git a/Orm/Xtensive.Orm/Orm/Internals/Prefetch/PrefetchManager.cs b/Orm/Xtensive.Orm/Orm/Internals/Prefetch/PrefetchManager.cs index b4b599a22b..d45d3acd49 100644 --- a/Orm/Xtensive.Orm/Orm/Internals/Prefetch/PrefetchManager.cs +++ b/Orm/Xtensive.Orm/Orm/Internals/Prefetch/PrefetchManager.cs @@ -45,7 +45,7 @@ public RootContainerCacheKey(TypeInfo type, IEnumerable { this.descriptors = descriptors; this.type = type; - hashCode = unchecked ((type.GetHashCode() * 397) ^ descriptors.GetHashCode()); + hashCode = HashCode.Combine(type, descriptors); } } @@ -342,4 +342,4 @@ public PrefetchManager(Session session) ColumnIndexesCacheSize, cacheEntry => cacheEntry.Key); } } -} \ No newline at end of file +} diff --git a/Orm/Xtensive.Orm/Orm/Linq/MemberCompilation/MemberCompilerProvider.cs b/Orm/Xtensive.Orm/Orm/Linq/MemberCompilation/MemberCompilerProvider.cs index 4a643c3f11..b117343201 100644 --- a/Orm/Xtensive.Orm/Orm/Linq/MemberCompilation/MemberCompilerProvider.cs +++ b/Orm/Xtensive.Orm/Orm/Linq/MemberCompilation/MemberCompilerProvider.cs @@ -27,12 +27,8 @@ public bool Equals(CompilerKey other) => metadataToken == other.metadataToken public override bool Equals(object obj) => obj is CompilerKey other && Equals(other); - public override int GetHashCode() - { - unchecked { - return module == null ? metadataToken : (module.GetHashCode() * 397) ^ metadataToken; - } - } + public override int GetHashCode() => + module == null ? metadataToken : HashCode.Combine(module, metadataToken); public CompilerKey(MemberInfo memberInfo) { diff --git a/Orm/Xtensive.Orm/Orm/Model/ColumnInfo.cs b/Orm/Xtensive.Orm/Orm/Model/ColumnInfo.cs index b6fe08f6ff..5614a11c14 100644 --- a/Orm/Xtensive.Orm/Orm/Model/ColumnInfo.cs +++ b/Orm/Xtensive.Orm/Orm/Model/ColumnInfo.cs @@ -236,10 +236,7 @@ public override bool Equals(object obj) => || obj is ColumnInfo other && Equals(other); /// - public override int GetHashCode() - { - return field.GetHashCode(); - } + public override int GetHashCode() => field.GetHashCode(); #endregion diff --git a/Orm/Xtensive.Orm/Orm/Model/IndexInfoRef.cs b/Orm/Xtensive.Orm/Orm/Model/IndexInfoRef.cs index 12ad5cd538..f85b321a55 100644 --- a/Orm/Xtensive.Orm/Orm/Model/IndexInfoRef.cs +++ b/Orm/Xtensive.Orm/Orm/Model/IndexInfoRef.cs @@ -86,14 +86,7 @@ public override bool Equals(object obj) } /// - public override int GetHashCode() - { - unchecked { - return - ((IndexName!=null ? IndexName.GetHashCode() : 0) * 397) ^ - (TypeName!=null ? TypeName.GetHashCode() : 0); - } - } + public override int GetHashCode() => HashCode.Combine(IndexName, TypeName); /// /// Implements the operator ==. @@ -143,4 +136,4 @@ public IndexInfoRef(IndexInfo indexInfo) KeyTupleDescriptor = indexInfo.KeyTupleDescriptor; } } -} \ No newline at end of file +} diff --git a/Orm/Xtensive.Orm/Orm/Model/KeyField.cs b/Orm/Xtensive.Orm/Orm/Model/KeyField.cs index 1856846ce9..b21cbaff36 100644 --- a/Orm/Xtensive.Orm/Orm/Model/KeyField.cs +++ b/Orm/Xtensive.Orm/Orm/Model/KeyField.cs @@ -22,10 +22,7 @@ public sealed class KeyField : Node public Direction Direction { get; private set; } /// - public override int GetHashCode() - { - return Name.GetHashCode() ^ Direction.GetHashCode(); - } + public override int GetHashCode() => HashCode.Combine(Name, Direction); /// public override bool Equals(object obj) => @@ -54,4 +51,4 @@ public KeyField(string name, Direction direction) : base(name) Direction = direction; } } -} \ No newline at end of file +} diff --git a/Orm/Xtensive.Orm/Orm/Providers/Expressions/QueryParameterIdentity.cs b/Orm/Xtensive.Orm/Orm/Providers/Expressions/QueryParameterIdentity.cs index 344c1a0781..c4c69ad4cf 100644 --- a/Orm/Xtensive.Orm/Orm/Providers/Expressions/QueryParameterIdentity.cs +++ b/Orm/Xtensive.Orm/Orm/Providers/Expressions/QueryParameterIdentity.cs @@ -32,16 +32,7 @@ public bool Equals(QueryParameterIdentity other) && Mapping.Equals(other.Mapping); } - public override int GetHashCode() - { - unchecked { - var hashCode = FieldName.GetHashCode(); - hashCode = (hashCode * 397) ^ ClosureObject.GetHashCode(); - hashCode = (hashCode * 397) ^ (int) BindingType; - hashCode = (hashCode * 397) ^ Mapping.GetHashCode(); - return hashCode; - } - } + public override int GetHashCode() => HashCode.Combine(FieldName, ClosureObject, BindingType, Mapping); public static bool operator ==(QueryParameterIdentity left, QueryParameterIdentity right) { @@ -71,4 +62,4 @@ public QueryParameterIdentity(TypeMapping mapping, object closureObject, string BindingType = bindingType; } } -} \ No newline at end of file +} diff --git a/Orm/Xtensive.Orm/Orm/Providers/Requests/PersistRequestBuilderTask.cs b/Orm/Xtensive.Orm/Orm/Providers/Requests/PersistRequestBuilderTask.cs index 0acabb0291..bc0e8efb02 100644 --- a/Orm/Xtensive.Orm/Orm/Providers/Requests/PersistRequestBuilderTask.cs +++ b/Orm/Xtensive.Orm/Orm/Providers/Requests/PersistRequestBuilderTask.cs @@ -61,16 +61,9 @@ public override bool Equals(object obj) } /// - public override int GetHashCode() - { - return hashCode; - } + public override int GetHashCode() => hashCode; - private int CalculateHashCode() - { - return Type.GetHashCode() ^ Kind.GetHashCode() ^ ValidateVersion.GetHashCode() - ^ HashBits(AvailableFields) ^ HashBits(ChangedFields); - } + private int CalculateHashCode() => HashCode.Combine(Type, Kind, ValidateVersion, HashBits(AvailableFields), HashBits(ChangedFields)); private int HashBits(BitArray bits) { @@ -139,4 +132,4 @@ private PersistRequestBuilderTask(PersistRequestKind kind, TypeInfo type, BitArr hashCode = CalculateHashCode(); } } -} \ No newline at end of file +} diff --git a/Orm/Xtensive.Orm/Orm/Rse/Column.cs b/Orm/Xtensive.Orm/Orm/Rse/Column.cs index 01bd726416..66ffac5924 100644 --- a/Orm/Xtensive.Orm/Orm/Rse/Column.cs +++ b/Orm/Xtensive.Orm/Orm/Rse/Column.cs @@ -56,10 +56,7 @@ public override bool Equals(object obj) } /// - public override int GetHashCode() - { - return Name.GetHashCode(); - } + public override int GetHashCode() => Name.GetHashCode(); /// /// Implements the operator ==. @@ -127,4 +124,4 @@ protected Column(string name, ColNum index, Type type, Column originalColumn) Origin = originalColumn==null ? this : originalColumn.Origin; } } -} \ No newline at end of file +} diff --git a/Orm/Xtensive.Orm/Orm/Structure.cs b/Orm/Xtensive.Orm/Orm/Structure.cs index 4777d234ad..be199fb5a5 100644 --- a/Orm/Xtensive.Orm/Orm/Structure.cs +++ b/Orm/Xtensive.Orm/Orm/Structure.cs @@ -345,10 +345,7 @@ private bool InnerEquals(Structure other, bool thisIsBound, bool otherIsBound) } /// - public override int GetHashCode() - { - return Tuple.GetHashCode(); - } + public override int GetHashCode() => Tuple.GetHashCode(); #endregion @@ -485,4 +482,4 @@ protected Structure(SerializationInfo info, StreamingContext context) DeserializationContext.Demand().SetObjectData(this, info, context); } } -} \ No newline at end of file +} diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Hints/ChangeFieldTypeHint.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Hints/ChangeFieldTypeHint.cs index 64df8b31c3..a767ccb864 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Hints/ChangeFieldTypeHint.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Hints/ChangeFieldTypeHint.cs @@ -51,15 +51,7 @@ public bool Equals(ChangeFieldTypeHint other) public override bool Equals(UpgradeHint other) => Equals(other as ChangeFieldTypeHint); /// - public override int GetHashCode() - { - unchecked { - int result = base.GetHashCode(); - result = (result * 397) ^ (Type != null ? Type.GetHashCode() : 0); - result = (result * 397) ^ (FieldName != null ? FieldName.GetHashCode() : 0); - return result; - } - } + public override int GetHashCode() => HashCode.Combine(base.GetHashCode(), Type, FieldName); /// public override string ToString() => $"Change type of field: {Type}.{FieldName}"; @@ -94,4 +86,4 @@ public static ChangeFieldTypeHint Create(Expression> property return new ChangeFieldTypeHint(typeof(T), propertyAccessExpression.GetProperty().Name); } } -} \ No newline at end of file +} diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Hints/CopyFieldHint.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Hints/CopyFieldHint.cs index b001e748fd..1349bcd4ec 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Hints/CopyFieldHint.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Hints/CopyFieldHint.cs @@ -57,17 +57,7 @@ public bool Equals(CopyFieldHint other) public override bool Equals(UpgradeHint other) => Equals(other as CopyFieldHint); /// - public override int GetHashCode() - { - unchecked { - int result = base.GetHashCode(); - result = (result * 397) ^ (SourceType != null ? SourceType.GetHashCode() : 0); - result = (result * 397) ^ (SourceField != null ? SourceField.GetHashCode() : 0); - result = (result * 397) ^ (TargetType != null ? TargetType.GetHashCode() : 0); - result = (result * 397) ^ (TargetField != null ? TargetField.GetHashCode() : 0); - return result; - } - } + public override int GetHashCode() => HashCode.Combine(base.GetHashCode(), SourceType, SourceField, TargetType, TargetField); /// public override string ToString() => @@ -192,4 +182,4 @@ public static CopyFieldHint Create( typeof(TTarget), targetField); } } -} \ No newline at end of file +} diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Hints/MergeTypeHint.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Hints/MergeTypeHint.cs index 11f6ed1e35..ba8534df8e 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Hints/MergeTypeHint.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Hints/MergeTypeHint.cs @@ -46,15 +46,7 @@ public bool Equals(MergeTypeHint other) public override bool Equals(UpgradeHint other) => Equals(other as MergeTypeHint); /// - public override int GetHashCode() - { - unchecked { - int result = base.GetHashCode(); - result = (result * 397) ^ (NewType != null ? NewType.GetHashCode() : 0); - result = (result * 397) ^ (OldType != null ? OldType.GetHashCode() : 0); - return result; - } - } + public override int GetHashCode() => HashCode.Combine(base.GetHashCode(), NewType, OldType); /// public override string ToString() => @@ -92,4 +84,4 @@ public static MergeTypeHint Create() return new MergeTypeHint(typeof(TOld), typeof(TNew)); } } -} \ No newline at end of file +} diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Hints/MoveFieldHint.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Hints/MoveFieldHint.cs index 0a8069668a..bbb8c4404c 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Hints/MoveFieldHint.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Hints/MoveFieldHint.cs @@ -58,17 +58,7 @@ public bool Equals(MoveFieldHint other) public override bool Equals(UpgradeHint other) => Equals(other as MoveFieldHint); /// - public override int GetHashCode() - { - unchecked { - int result = base.GetHashCode(); - result = (result * 397) ^ (SourceType != null ? SourceType.GetHashCode() : 0); - result = (result * 397) ^ (SourceField != null ? SourceField.GetHashCode() : 0); - result = (result * 397) ^ (TargetType != null ? TargetType.GetHashCode() : 0); - result = (result * 397) ^ (TargetField != null ? TargetField.GetHashCode() : 0); - return result; - } - } + public override int GetHashCode() => HashCode.Combine(base.GetHashCode(), SourceType, SourceField, TargetType, TargetField); /// public override string ToString() => @@ -194,4 +184,4 @@ public static MoveFieldHint Create( typeof(TTarget), targetField); } } -} \ No newline at end of file +} diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Hints/RecycledTypeHint.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Hints/RecycledTypeHint.cs index 6551753770..7866b5b127 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Hints/RecycledTypeHint.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Hints/RecycledTypeHint.cs @@ -40,14 +40,7 @@ public bool Equals(RecycledTypeHint other) public override bool Equals(UpgradeHint other) => Equals(other as RecycledTypeHint); /// - public override int GetHashCode() - { - unchecked { - int result = base.GetHashCode(); - result = (result * 397) ^ (Type != null ? Type.GetHashCode() : 0); - return result; - } - } + public override int GetHashCode() => HashCode.Combine(base.GetHashCode(), Type); /// public override string ToString() => $"Recycled type: {Type}"; @@ -79,4 +72,4 @@ public static RecycledTypeHint Create() return new RecycledTypeHint(typeof(T)); } } -} \ No newline at end of file +} diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Hints/RemoveFieldHint.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Hints/RemoveFieldHint.cs index f86f45cfe0..ca1df09d3b 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Hints/RemoveFieldHint.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Hints/RemoveFieldHint.cs @@ -55,15 +55,7 @@ public bool Equals(RemoveFieldHint other) public override bool Equals(UpgradeHint other) => Equals(other as RemoveFieldHint); /// - public override int GetHashCode() - { - unchecked { - int result = base.GetHashCode(); - result = (result * 397) ^ (Type != null ? Type.GetHashCode() : 0); - result = (result * 397) ^ (Field != null ? Field.GetHashCode() : 0); - return result; - } - } + public override int GetHashCode() => HashCode.Combine(base.GetHashCode(), Type, Field); /// public override string ToString() => $"Remove field: {Type}.{Field}"; @@ -112,4 +104,4 @@ public static RemoveFieldHint Create(Expression> propertyAcce return new RemoveFieldHint(typeof(T), propertyAccessExpression.GetProperty().Name); } } -} \ No newline at end of file +} diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Hints/RemoveTypeHint.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Hints/RemoveTypeHint.cs index 17134b2290..5a8c7c8aa1 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Hints/RemoveTypeHint.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Hints/RemoveTypeHint.cs @@ -43,14 +43,7 @@ public bool Equals(RemoveTypeHint other) public override bool Equals(UpgradeHint other) => Equals(other as RemoveTypeHint); /// - public override int GetHashCode() - { - unchecked { - int result = base.GetHashCode(); - result = (result * 397) ^ (Type != null ? Type.GetHashCode() : 0); - return result; - } - } + public override int GetHashCode() => HashCode.Combine(base.GetHashCode(), Type); /// public override string ToString() => $"Remove type: {Type}"; @@ -69,4 +62,4 @@ public RemoveTypeHint(string typeName) AffectedTables = Array.Empty(); } } -} \ No newline at end of file +} diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Hints/RenameFieldHint.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Hints/RenameFieldHint.cs index 465531cb06..bb2941c0ae 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Hints/RenameFieldHint.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Hints/RenameFieldHint.cs @@ -50,16 +50,7 @@ public bool Equals(RenameFieldHint other) public override bool Equals(UpgradeHint other) => Equals(other as RenameFieldHint); /// - public override int GetHashCode() - { - unchecked { - int result = base.GetHashCode(); - result = (result * 397) ^ (TargetType != null ? TargetType.GetHashCode() : 0); - result = (result * 397) ^ (OldFieldName != null ? OldFieldName.GetHashCode() : 0); - result = (result * 397) ^ (NewFieldName != null ? NewFieldName.GetHashCode() : 0); - return result; - } - } + public override int GetHashCode() => HashCode.Combine(base.GetHashCode(), TargetType, OldFieldName, NewFieldName); /// public override string ToString() => @@ -102,4 +93,4 @@ public static RenameFieldHint Create( field.ReflectedType, oldFieldName, field.Name); } } -} \ No newline at end of file +} diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Hints/RenameTypeHint.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Hints/RenameTypeHint.cs index 070e654a1a..3da8811fca 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Hints/RenameTypeHint.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Hints/RenameTypeHint.cs @@ -46,15 +46,7 @@ public bool Equals(RenameTypeHint other) public override bool Equals(UpgradeHint other) => Equals(other as RenameTypeHint); /// - public override int GetHashCode() - { - unchecked { - int result = base.GetHashCode(); - result = (result * 397) ^ (NewType != null ? NewType.GetHashCode() : 0); - result = (result * 397) ^ (OldType != null ? OldType.GetHashCode() : 0); - return result; - } - } + public override int GetHashCode() => HashCode.Combine(base.GetHashCode(), NewType, OldType); /// public override string ToString() => @@ -91,4 +83,4 @@ public static RenameTypeHint Create(string oldName) return new RenameTypeHint(oldName, typeof(T)); } } -} \ No newline at end of file +} diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Hints/UpgradeHint.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Hints/UpgradeHint.cs index 5b94bfe73f..2aa786982a 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Hints/UpgradeHint.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Hints/UpgradeHint.cs @@ -27,10 +27,7 @@ public override bool Equals(object obj) => || obj is UpgradeHint other && Equals(other); /// - public override int GetHashCode() - { - return base.GetHashCode(); - } + public override int GetHashCode() => base.GetHashCode(); // Constructors diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Model/PartialIndexFilterInfo.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Model/PartialIndexFilterInfo.cs index 13e68ff93e..94599e630e 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Model/PartialIndexFilterInfo.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Model/PartialIndexFilterInfo.cs @@ -36,10 +36,7 @@ public override bool Equals(object obj) return Equals((PartialIndexFilterInfo)obj); } - public override int GetHashCode() - { - return Expression.GetHashCode(); - } + public override int GetHashCode() => Expression.GetHashCode(); #endregion @@ -57,4 +54,4 @@ public PartialIndexFilterInfo(string expression) Expression = expression; } } -} \ No newline at end of file +} diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/Model/StorageTypeInfo.cs b/Orm/Xtensive.Orm/Orm/Upgrade/Model/StorageTypeInfo.cs index ea3c319e17..fff627f931 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/Model/StorageTypeInfo.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/Model/StorageTypeInfo.cs @@ -121,20 +121,7 @@ public override bool Equals(object obj) } /// - public override int GetHashCode() - { - unchecked { - int result = (Type != null ? Type.GetHashCode() : 0); - result = (result * 397) ^ (IsNullable ? 1 : 0); - if (Length.HasValue) - result = (result * 397) ^ Length.Value; - if (Scale.HasValue) - result = (result * 397) ^ Scale.Value; - if (Precision.HasValue) - result = (result * 397) ^ Precision.Value; - return result; - } - } + public override int GetHashCode() => HashCode.Combine(Type, IsNullable, Length, Scale, Precision); /// /// Implements the operator ==. diff --git a/Orm/Xtensive.Orm/Orm/UrlInfo.cs b/Orm/Xtensive.Orm/Orm/UrlInfo.cs index 9c5841de5a..7bf56a02a2 100644 --- a/Orm/Xtensive.Orm/Orm/UrlInfo.cs +++ b/Orm/Xtensive.Orm/Orm/UrlInfo.cs @@ -404,10 +404,7 @@ public override bool Equals(object obj) } /// - public override int GetHashCode() - { - return (url!=null ? url.GetHashCode() : 0); - } + public override int GetHashCode() => url?.GetHashCode() ?? 0; /// /// Checks specified objects for equality. @@ -472,4 +469,4 @@ public virtual void GetObjectData(SerializationInfo info, StreamingContext conte #endregion } -} \ No newline at end of file +} diff --git a/Orm/Xtensive.Orm/Sql/Dml/SqlCustomFunctionType.cs b/Orm/Xtensive.Orm/Sql/Dml/SqlCustomFunctionType.cs index 5f2798c77f..3aa7e2092d 100644 --- a/Orm/Xtensive.Orm/Sql/Dml/SqlCustomFunctionType.cs +++ b/Orm/Xtensive.Orm/Sql/Dml/SqlCustomFunctionType.cs @@ -40,10 +40,7 @@ public override bool Equals(object obj) return Equals((SqlCustomFunctionType) obj); } - public override int GetHashCode() - { - return Name.GetHashCode(); - } + public override int GetHashCode() => Name.GetHashCode(); public static bool operator ==(SqlCustomFunctionType left, SqlCustomFunctionType right) { diff --git a/Orm/Xtensive.Orm/Tuples/Transform/WrappingTransformTupleBase.cs b/Orm/Xtensive.Orm/Tuples/Transform/WrappingTransformTupleBase.cs index 5d2c9aba60..6544685776 100644 --- a/Orm/Xtensive.Orm/Tuples/Transform/WrappingTransformTupleBase.cs +++ b/Orm/Xtensive.Orm/Tuples/Transform/WrappingTransformTupleBase.cs @@ -68,10 +68,7 @@ public sealed override bool Equals(Tuple other) } /// - public sealed override int GetHashCode() - { - return origin.GetHashCode(); - } + public sealed override int GetHashCode() => origin.GetHashCode(); // Constructors @@ -86,4 +83,4 @@ protected WrappingTransformTupleBase(Tuple tuple) origin = tuple; } } -} \ No newline at end of file +} diff --git a/Weaver/Xtensive.Orm.Weaver/TypeIdentity.cs b/Weaver/Xtensive.Orm.Weaver/TypeIdentity.cs index 1eb460a093..48562f4c1d 100644 --- a/Weaver/Xtensive.Orm.Weaver/TypeIdentity.cs +++ b/Weaver/Xtensive.Orm.Weaver/TypeIdentity.cs @@ -37,14 +37,9 @@ public bool Equals(TypeIdentity other) && WeavingHelper.TypeNameComparer.Equals(TypeName, other.TypeName); } - public override int GetHashCode() - { - unchecked { - var typeNameHash = TypeName!=null ? WeavingHelper.TypeNameComparer.GetHashCode(TypeName) : 0; - var assemblyNameHash = AssemblyName!=null ? WeavingHelper.AssemblyNameComparer.GetHashCode(AssemblyName) : 0; - return assemblyNameHash * 397 ^ typeNameHash; - } - } + public override int GetHashCode() => HashCode.Combine( + TypeName != null ? WeavingHelper.TypeNameComparer.GetHashCode(TypeName) : 0, + AssemblyName != null ? WeavingHelper.AssemblyNameComparer.GetHashCode(AssemblyName) : 0); public static bool operator ==(TypeIdentity left, TypeIdentity right) { @@ -63,4 +58,4 @@ public TypeIdentity(TypeReference type) typeName = type.FullName; } } -} \ No newline at end of file +}