aboutsummaryrefslogtreecommitdiff
path: root/src/bytes
diff options
context:
space:
mode:
Diffstat (limited to 'src/bytes')
-rw-r--r--src/bytes/hash/hash.go4
-rw-r--r--src/bytes/hash/hash_test.go14
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{}