diff options
author | Keith Randall <khr@google.com> | 2019-10-21 14:10:35 -0700 |
---|---|---|
committer | Keith Randall <khr@golang.org> | 2019-10-21 22:01:12 +0000 |
commit | dba19c65a78c017e4f3fab94c8288bb120203078 (patch) | |
tree | feb51c7baec9a3e6d8d2d7a18ec187fd93a82747 /src/bytes | |
parent | 10e7bc994f47a71472c49f84ab782fdfe44bf22e (diff) | |
download | go-dba19c65a78c017e4f3fab94c8288bb120203078.tar.gz go-dba19c65a78c017e4f3fab94c8288bb120203078.zip |
bytes/hash: initialize all 64 bits of hash seed
Fixes #34925
Change-Id: Iadf12ca47a69b62c3f48d732b430cc85cf62a91c
Reviewed-on: https://go-review.googlesource.com/c/go/+/202577
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Diffstat (limited to 'src/bytes')
-rw-r--r-- | src/bytes/hash/hash.go | 4 | ||||
-rw-r--r-- | src/bytes/hash/hash_test.go | 14 |
2 files changed, 17 insertions, 1 deletions
diff --git a/src/bytes/hash/hash.go b/src/bytes/hash/hash.go index 0e44e37ae7..cc78b22901 100644 --- a/src/bytes/hash/hash.go +++ b/src/bytes/hash/hash.go @@ -130,7 +130,9 @@ func MakeSeed(s uint64) Seed { // New returns a new Hash object. Different hash objects allocated by // this function will very likely have different seeds. func New() *Hash { - seed := Seed{s: uint64(runtime_fastrand())} + s1 := uint64(runtime_fastrand()) + s2 := uint64(runtime_fastrand()) + seed := Seed{s: s1<<32 + s2} return &Hash{ seed: seed, state: seed, diff --git a/src/bytes/hash/hash_test.go b/src/bytes/hash/hash_test.go index 311f451be2..f36d506831 100644 --- a/src/bytes/hash/hash_test.go +++ b/src/bytes/hash/hash_test.go @@ -61,6 +61,20 @@ func TestHashBytesVsString(t *testing.T) { } } +func TestHashHighBytes(t *testing.T) { + // See issue 34925. + const N = 10 + m := map[uint64]struct{}{} + for i := 0; i < N; i++ { + h := hash.New() + h.AddString("foo") + m[h.Hash()>>32] = struct{}{} + } + if len(m) < N/2 { + t.Errorf("from %d seeds, wanted at least %d different hashes; got %d", N, N/2, len(m)) + } +} + // Make sure a Hash implements the hash.Hash and hash.Hash64 interfaces. var _ basehash.Hash = &hash.Hash{} var _ basehash.Hash64 = &hash.Hash{} |