Commit dba19c65 authored by Keith Randall's avatar Keith Randall Committed by Keith Randall

bytes/hash: initialize all 64 bits of hash seed

Fixes #34925

Change-Id: Iadf12ca47a69b62c3f48d732b430cc85cf62a91c
Reviewed-on: https://go-review.googlesource.com/c/go/+/202577Reviewed-by: default avatarMatthew Dempsky <mdempsky@google.com>
Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
parent 10e7bc99
...@@ -180,6 +180,19 @@ TODO ...@@ -180,6 +180,19 @@ TODO
</dl><!-- mime --> </dl><!-- mime -->
<dl id="math"><dt><a href="/pkg/math/">math</a></dt>
<dd>
<p><!-- CL 127458 -->
The new <a href="/pkg/math/#Fma"><code>Fma</code></a> function
computes <code>x*y+z</code> in floating point with no
intermediate rounding of the <code>x*y</code>
computation. Several architectures implement this computation
using dedicated hardware instructions for additional
performance.
</p>
</dl><!-- math -->
<dl id="plugin"><dt><a href="/pkg/plugin/">plugin</a></dt> <dl id="plugin"><dt><a href="/pkg/plugin/">plugin</a></dt>
<dd> <dd>
<p><!-- CL 191617 --> <p><!-- CL 191617 -->
......
...@@ -130,7 +130,9 @@ func MakeSeed(s uint64) Seed { ...@@ -130,7 +130,9 @@ func MakeSeed(s uint64) Seed {
// New returns a new Hash object. Different hash objects allocated by // New returns a new Hash object. Different hash objects allocated by
// this function will very likely have different seeds. // this function will very likely have different seeds.
func New() *Hash { 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{ return &Hash{
seed: seed, seed: seed,
state: seed, state: seed,
......
...@@ -61,6 +61,20 @@ func TestHashBytesVsString(t *testing.T) { ...@@ -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. // Make sure a Hash implements the hash.Hash and hash.Hash64 interfaces.
var _ basehash.Hash = &hash.Hash{} var _ basehash.Hash = &hash.Hash{}
var _ basehash.Hash64 = &hash.Hash{} var _ basehash.Hash64 = &hash.Hash{}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment