package hyperloglog import ( "github.com/alicebob/miniredis/v2/metro" "math" "math/bits" ) var hash = hashFunc func beta14(ez float64) float64 { zl := math.Log(ez + 1) return -0.370393911*ez + 0.070471823*zl + 0.17393686*math.Pow(zl, 2) + 0.16339839*math.Pow(zl, 3) + -0.09237745*math.Pow(zl, 4) + 0.03738027*math.Pow(zl, 5) + -0.005384159*math.Pow(zl, 6) + 0.00042419*math.Pow(zl, 7) } func beta16(ez float64) float64 { zl := math.Log(ez + 1) return -0.37331876643753059*ez + -1.41704077448122989*zl + 0.40729184796612533*math.Pow(zl, 2) + 1.56152033906584164*math.Pow(zl, 3) + -0.99242233534286128*math.Pow(zl, 4) + 0.26064681399483092*math.Pow(zl, 5) + -0.03053811369682807*math.Pow(zl, 6) + 0.00155770210179105*math.Pow(zl, 7) } func alpha(m float64) float64 { switch m { case 16: return 0.673 case 32: return 0.697 case 64: return 0.709 } return 0.7213 / (1 + 1.079/m) } func getPosVal(x uint64, p uint8) (uint64, uint8) { i := bextr(x, 64-p, p) // {x63,...,x64-p} w := x<

> start) & ((1 << length) - 1) } func bextr32(v uint32, start, length uint8) uint32 { return (v >> start) & ((1 << length) - 1) } func hashFunc(e []byte) uint64 { return metro.Hash64(e, 1337) }