mirror of
https://github.com/golang/go
synced 2024-11-19 05:14:50 -07:00
runtime: use better hash for floating point inputs
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
This commit is contained in:
parent
1338f327b2
commit
5fbcdb2661
@ -75,7 +75,7 @@ func f32hash(a *float32, s, h uintptr) uintptr {
|
|||||||
case f != f:
|
case f != f:
|
||||||
return c1 * (c0 ^ h ^ uintptr(fastrand2())) // any kind of NaN
|
return c1 * (c0 ^ h ^ uintptr(fastrand2())) // any kind of NaN
|
||||||
default:
|
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
|
return c1 * (c0 ^ h) // +0, -0
|
||||||
case f != f:
|
case f != f:
|
||||||
return c1 * (c0 ^ h ^ uintptr(fastrand2())) // any kind of NaN
|
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:
|
default:
|
||||||
return c1 * (c0 ^ h ^ *(*uintptr)(unsafe.Pointer(a)))
|
return memhash(unsafe.Pointer(a), 8, h)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user