utils.go 832 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. package hyperloglog
  2. import (
  3. "math"
  4. "math/bits"
  5. metro "github.com/dgryski/go-metro"
  6. )
  7. var hash = hashFunc
  8. func alpha(m float64) float64 {
  9. switch m {
  10. case 16:
  11. return 0.673
  12. case 32:
  13. return 0.697
  14. case 64:
  15. return 0.709
  16. }
  17. return 0.7213 / (1 + 1.079/m)
  18. }
  19. func getPosVal(x uint64, p uint8) (uint64, uint8) {
  20. i := bextr(x, 64-p, p) // {x63,...,x64-p}
  21. w := x<<p | 1<<(p-1) // {x63-p,...,x0}
  22. rho := uint8(bits.LeadingZeros64(w)) + 1
  23. return i, rho
  24. }
  25. func linearCount(m uint32, v uint32) float64 {
  26. fm := float64(m)
  27. return fm * math.Log(fm/float64(v))
  28. }
  29. func bextr(v uint64, start, length uint8) uint64 {
  30. return (v >> start) & ((1 << length) - 1)
  31. }
  32. func bextr32(v uint32, start, length uint8) uint32 {
  33. return (v >> start) & ((1 << length) - 1)
  34. }
  35. func hashFunc(e []byte) uint64 {
  36. return metro.Hash64(e, 1337)
  37. }