diff options
author | Jon Skeet <jonskeet@google.com> | 2016-12-16 10:42:13 +0000 |
---|---|---|
committer | Jon Skeet <skeet@pobox.com> | 2016-12-16 12:04:40 +0000 |
commit | b18bc9b9448d8c97b289f03a3cbad57191f30fad (patch) | |
tree | b4c469aec79178964fd6a51c91f17d57122b75f3 /csharp | |
parent | a95e38ce8dec20d327692f4f5c2b0d37d6776696 (diff) | |
download | protobuf-b18bc9b9448d8c97b289f03a3cbad57191f30fad.tar.gz protobuf-b18bc9b9448d8c97b289f03a3cbad57191f30fad.tar.bz2 protobuf-b18bc9b9448d8c97b289f03a3cbad57191f30fad.zip |
Give C# ByteString a sensible GetHashCode implementation.
Fixes #2511.
Diffstat (limited to 'csharp')
-rw-r--r-- | csharp/src/Google.Protobuf.Test/ByteStringTest.cs | 13 | ||||
-rw-r--r-- | csharp/src/Google.Protobuf/ByteString.cs | 2 |
2 files changed, 14 insertions, 1 deletions
diff --git a/csharp/src/Google.Protobuf.Test/ByteStringTest.cs b/csharp/src/Google.Protobuf.Test/ByteStringTest.cs index 685e130a..ff2444a3 100644 --- a/csharp/src/Google.Protobuf.Test/ByteStringTest.cs +++ b/csharp/src/Google.Protobuf.Test/ByteStringTest.cs @@ -167,5 +167,18 @@ namespace Google.Protobuf // Optimization which also fixes issue 61.
Assert.AreSame(ByteString.Empty, ByteString.FromBase64(""));
}
+
+ [Test]
+ public void GetHashCode_Regression()
+ {
+ // We used to have an awful hash algorithm where only the last four
+ // bytes were relevant. This is a regression test for
+ // https://github.com/google/protobuf/issues/2511
+
+ ByteString b1 = ByteString.CopyFrom(100, 1, 2, 3, 4);
+ ByteString b2 = ByteString.CopyFrom(200, 1, 2, 3, 4);
+ Assert.AreNotEqual(b1.GetHashCode(), b2.GetHashCode());
+ }
+
}
}
\ No newline at end of file diff --git a/csharp/src/Google.Protobuf/ByteString.cs b/csharp/src/Google.Protobuf/ByteString.cs index dd7f22d6..5c652cc3 100644 --- a/csharp/src/Google.Protobuf/ByteString.cs +++ b/csharp/src/Google.Protobuf/ByteString.cs @@ -303,7 +303,7 @@ namespace Google.Protobuf int ret = 23;
foreach (byte b in bytes)
{
- ret = (ret << 8) | b;
+ ret = (ret * 31) + b;
}
return ret;
}
|