mirror of
https://github.com/golang/go
synced 2024-11-23 06:00:08 -07:00
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>
This commit is contained in:
parent
10e7bc994f
commit
dba19c65a7
@ -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 {
|
|||||||
// 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) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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{}
|
||||||
|
Loading…
Reference in New Issue
Block a user