From e4419c2e8d5469787f997fbf0e74f9ef8383c140 Mon Sep 17 00:00:00 2001 From: qunyanm Date: Fri, 17 Apr 2015 13:17:41 -0700 Subject: HashCode for Set/MultiSet/Map should be independent of the order of the elements. --- Binaries/DafnyRuntime.cs | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) (limited to 'Binaries') diff --git a/Binaries/DafnyRuntime.cs b/Binaries/DafnyRuntime.cs index 2a553c81..fd680a0b 100644 --- a/Binaries/DafnyRuntime.cs +++ b/Binaries/DafnyRuntime.cs @@ -75,9 +75,9 @@ namespace Dafny return other is Set && Equals((Set)other); } public override int GetHashCode() { - var hashCode = 0; + var hashCode = 1; foreach (var t in dict.Keys) { - hashCode = (hashCode << 3) | (hashCode >> 29) ^ t.GetHashCode(); + hashCode = hashCode * (t.GetHashCode()+3); } return hashCode; } @@ -232,10 +232,11 @@ namespace Dafny return other is MultiSet && Equals((MultiSet)other); } public override int GetHashCode() { - var hashCode = 0; + var hashCode = 1; foreach (var kv in dict) { - hashCode = (hashCode << 3) | (hashCode >> 29) ^ kv.Key.GetHashCode(); - hashCode = (hashCode << 3) | (hashCode >> 29) ^ kv.Value.GetHashCode(); + var key = kv.Key.GetHashCode(); + key = (key << 3) | (key >> 29) ^ kv.Value.GetHashCode(); + hashCode = hashCode * (key + 3); } return hashCode; } @@ -401,10 +402,11 @@ namespace Dafny return other is Map && Equals((Map)other); } public override int GetHashCode() { - var hashCode = 0; + var hashCode = 1; foreach (var kv in dict) { - hashCode = (hashCode << 3) | (hashCode >> 29) ^ kv.Key.GetHashCode(); - hashCode = (hashCode << 3) | (hashCode >> 29) ^ kv.Value.GetHashCode(); + var key = kv.Key.GetHashCode(); + key = (key << 3) | (key >> 29) ^ kv.Value.GetHashCode(); + hashCode = hashCode * (key + 3); } return hashCode; } -- cgit v1.2.3