aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorvovapi <evgrafov.vladimir@gmail.com>2020-02-20 19:29:22 +0000
committerDmitri Shuralyov <dmitshur@golang.org>2020-02-24 15:47:07 +0000
commit17acbdb3571b9720dac8eb71f4df385e16c8c91e (patch)
treee7cda64a52a8d97e626c669c250551304e83bafd
parentbabeec29aa61b715e3ec529c5ec12475d3554f21 (diff)
downloadgo-17acbdb3571b9720dac8eb71f4df385e16c8c91e.tar.gz
go-17acbdb3571b9720dac8eb71f4df385e16c8c91e.zip
[release-branch.go1.14] hash/maphash: don't discard data on random seed init
Hash initializes seed on the first usage of seed or state with initSeed. initSeed uses SetSeed which discards accumulated data. This causes hash to return different sums for the same data in the first use and after reset. This CL fixes this issue by separating the seed set from data discard. Updates #37315 Change-Id: Ic7020702c2ce822eb700af462e37efab12f72054 GitHub-Last-Rev: 48b2f963e86c1b37d49b838a050cc4128bb01266 GitHub-Pull-Request: golang/go#37328 Reviewed-on: https://go-review.googlesource.com/c/go/+/220259 Run-TryBot: Emmanuel Odeke <emm.odeke@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Keith Randall <khr@golang.org> (cherry picked from commit 638df87fa4f927763f99ebf0c6bc9c4a5380d1f9) Reviewed-on: https://go-review.googlesource.com/c/go/+/220617 Run-TryBot: Dmitri Shuralyov <dmitshur@golang.org>
-rw-r--r--src/hash/maphash/maphash.go9
-rw-r--r--src/hash/maphash/maphash_test.go23
2 files changed, 30 insertions, 2 deletions
diff --git a/src/hash/maphash/maphash.go b/src/hash/maphash/maphash.go
index 4fef88e8ee..071dc04b54 100644
--- a/src/hash/maphash/maphash.go
+++ b/src/hash/maphash/maphash.go
@@ -69,7 +69,7 @@ type Hash struct {
// which does call h.initSeed.)
func (h *Hash) initSeed() {
if h.seed.s == 0 {
- h.SetSeed(MakeSeed())
+ h.setSeed(MakeSeed())
}
}
@@ -124,12 +124,17 @@ func (h *Hash) Seed() Seed {
// Two Hash objects with different seeds will very likely behave differently.
// Any bytes added to h before this call will be discarded.
func (h *Hash) SetSeed(seed Seed) {
+ h.setSeed(seed)
+ h.n = 0
+}
+
+// setSeed sets seed without discarding accumulated data.
+func (h *Hash) setSeed(seed Seed) {
if seed.s == 0 {
panic("maphash: use of uninitialized Seed")
}
h.seed = seed
h.state = seed
- h.n = 0
}
// Reset discards all bytes added to h.
diff --git a/src/hash/maphash/maphash_test.go b/src/hash/maphash/maphash_test.go
index 31d84a3b50..0164a9e20a 100644
--- a/src/hash/maphash/maphash_test.go
+++ b/src/hash/maphash/maphash_test.go
@@ -83,6 +83,29 @@ func TestHashHighBytes(t *testing.T) {
}
}
+func TestRepeat(t *testing.T) {
+ h1 := new(Hash)
+ h1.WriteString("testing")
+ sum1 := h1.Sum64()
+
+ h1.Reset()
+ h1.WriteString("testing")
+ sum2 := h1.Sum64()
+
+ if sum1 != sum2 {
+ t.Errorf("different sum after reseting: %#x != %#x", sum1, sum2)
+ }
+
+ h2 := new(Hash)
+ h2.SetSeed(h1.Seed())
+ h2.WriteString("testing")
+ sum3 := h2.Sum64()
+
+ if sum1 != sum3 {
+ t.Errorf("different sum on the same seed: %#x != %#x", sum1, sum3)
+ }
+}
+
// Make sure a Hash implements the hash.Hash and hash.Hash64 interfaces.
var _ hash.Hash = &Hash{}
var _ hash.Hash64 = &Hash{}