mirror of
https://github.com/golang/go
synced 2024-11-26 21:51:44 -07:00
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.
Fixes #37315
Change-Id: Ic7020702c2ce822eb700af462e37efab12f72054
GitHub-Last-Rev: 48b2f963e8
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>
This commit is contained in:
parent
7ee3b63c8b
commit
638df87fa4
@ -69,7 +69,7 @@ type Hash struct {
|
|||||||
// which does call h.initSeed.)
|
// which does call h.initSeed.)
|
||||||
func (h *Hash) initSeed() {
|
func (h *Hash) initSeed() {
|
||||||
if h.seed.s == 0 {
|
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.
|
// Two Hash objects with different seeds will very likely behave differently.
|
||||||
// Any bytes added to h before this call will be discarded.
|
// Any bytes added to h before this call will be discarded.
|
||||||
func (h *Hash) SetSeed(seed Seed) {
|
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 {
|
if seed.s == 0 {
|
||||||
panic("maphash: use of uninitialized Seed")
|
panic("maphash: use of uninitialized Seed")
|
||||||
}
|
}
|
||||||
h.seed = seed
|
h.seed = seed
|
||||||
h.state = seed
|
h.state = seed
|
||||||
h.n = 0
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reset discards all bytes added to h.
|
// Reset discards all bytes added to h.
|
||||||
|
@ -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.
|
// Make sure a Hash implements the hash.Hash and hash.Hash64 interfaces.
|
||||||
var _ hash.Hash = &Hash{}
|
var _ hash.Hash = &Hash{}
|
||||||
var _ hash.Hash64 = &Hash{}
|
var _ hash.Hash64 = &Hash{}
|
||||||
|
Loading…
Reference in New Issue
Block a user