]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: use better hash for floating point inputs
authorRuss Cox <rsc@golang.org>
Wed, 6 Aug 2014 20:47:54 +0000 (16:47 -0400)
committerRuss Cox <rsc@golang.org>
Wed, 6 Aug 2014 20:47:54 +0000 (16:47 -0400)
Hashing on the bytes instead of the words does
a (much) better job of using all the bits, so that
maps of floats have linear performance.

LGTM=khr
R=golang-codereviews, khr
CC=adonovan, golang-codereviews
https://golang.org/cl/126720044

src/pkg/runtime/alg.go

index 251374a9460b1105d064c3a34737fd44bb94122f..f2bb202c68f6565ce838fb27632fe60ff8e3f279 100644 (file)
@@ -75,7 +75,7 @@ func f32hash(a *float32, s, h uintptr) uintptr {
        case f != f:
                return c1 * (c0 ^ h ^ uintptr(fastrand2())) // any kind of NaN
        default:
-               return c1 * (c0 ^ h ^ uintptr(*(*uint32)(unsafe.Pointer(a))))
+               return memhash(unsafe.Pointer(a), 4, h)
        }
 }
 
@@ -86,11 +86,8 @@ func f64hash(a *float64, s, h uintptr) uintptr {
                return c1 * (c0 ^ h) // +0, -0
        case f != f:
                return c1 * (c0 ^ h ^ uintptr(fastrand2())) // any kind of NaN
-       case ptrSize == 4:
-               x := (*[2]uintptr)(unsafe.Pointer(a))
-               return c1 * (c0 ^ h ^ (x[1] * c1) ^ x[0])
        default:
-               return c1 * (c0 ^ h ^ *(*uintptr)(unsafe.Pointer(a)))
+               return memhash(unsafe.Pointer(a), 8, h)
        }
 }