diff --git a/CutList.Core/BinComparer.cs b/CutList.Core/BinComparer.cs index 9c64d09..80bbc81 100644 --- a/CutList.Core/BinComparer.cs +++ b/CutList.Core/BinComparer.cs @@ -36,23 +36,25 @@ namespace CutList.Core unchecked { + // Prime multiplier reduces collisions in hash-based collections + const int HashMultiplier = 23; int hash = 17; - hash = hash * 23 + bin.Length.GetHashCode(); - hash = hash * 23 + bin.Spacing.GetHashCode(); - hash = hash * 23 + bin.Items.Count.GetHashCode(); + hash = hash * HashMultiplier + bin.Length.GetHashCode(); + hash = hash * HashMultiplier + bin.Spacing.GetHashCode(); + hash = hash * HashMultiplier + bin.Items.Count.GetHashCode(); // Include first and last item in hash for better distribution if (bin.Items.Count > 0) { var firstItem = bin.Items[0]; - hash = hash * 23 + (firstItem.Name?.GetHashCode() ?? 0); - hash = hash * 23 + firstItem.Length.GetHashCode(); + hash = hash * HashMultiplier + (firstItem.Name?.GetHashCode() ?? 0); + hash = hash * HashMultiplier + firstItem.Length.GetHashCode(); if (bin.Items.Count > 1) { var lastItem = bin.Items[bin.Items.Count - 1]; - hash = hash * 23 + (lastItem.Name?.GetHashCode() ?? 0); - hash = hash * 23 + lastItem.Length.GetHashCode(); + hash = hash * HashMultiplier + (lastItem.Name?.GetHashCode() ?? 0); + hash = hash * HashMultiplier + lastItem.Length.GetHashCode(); } } diff --git a/CutList.Core/BinItem.cs b/CutList.Core/BinItem.cs index 28ceffb..96b5ef2 100644 --- a/CutList.Core/BinItem.cs +++ b/CutList.Core/BinItem.cs @@ -77,9 +77,11 @@ { unchecked { + // Prime multiplier reduces collisions in hash-based collections + const int HashMultiplier = 23; int hash = 17; - hash = hash * 23 + (Name?.GetHashCode() ?? 0); - hash = hash * 23 + Length.GetHashCode(); + hash = hash * HashMultiplier + (Name?.GetHashCode() ?? 0); + hash = hash * HashMultiplier + Length.GetHashCode(); return hash; } } diff --git a/CutList.Core/MultiBin.cs b/CutList.Core/MultiBin.cs index 3d07cbd..dc38396 100644 --- a/CutList.Core/MultiBin.cs +++ b/CutList.Core/MultiBin.cs @@ -112,10 +112,12 @@ { unchecked { + // Prime multiplier reduces collisions in hash-based collections + const int HashMultiplier = 23; int hash = 17; - hash = hash * 23 + Quantity.GetHashCode(); - hash = hash * 23 + Length.GetHashCode(); - hash = hash * 23 + Priority.GetHashCode(); + hash = hash * HashMultiplier + Quantity.GetHashCode(); + hash = hash * HashMultiplier + Length.GetHashCode(); + hash = hash * HashMultiplier + Priority.GetHashCode(); return hash; } } diff --git a/CutList/Tool.cs b/CutList/Tool.cs index e533d48..28f1985 100644 --- a/CutList/Tool.cs +++ b/CutList/Tool.cs @@ -96,10 +96,12 @@ { unchecked { + // Prime multiplier reduces collisions in hash-based collections + const int HashMultiplier = 23; int hash = 17; - hash = hash * 23 + (Name?.GetHashCode() ?? 0); - hash = hash * 23 + Kerf.GetHashCode(); - hash = hash * 23 + AllowUserToChange.GetHashCode(); + hash = hash * HashMultiplier + (Name?.GetHashCode() ?? 0); + hash = hash * HashMultiplier + Kerf.GetHashCode(); + hash = hash * HashMultiplier + AllowUserToChange.GetHashCode(); return hash; } }