fnv1a.go 836 B

123456789101112131415161718192021222324252627282930313233343536373839
  1. package statsd
  2. const (
  3. // FNV-1a
  4. offset32 = uint32(2166136261)
  5. prime32 = uint32(16777619)
  6. // init32 is what 32 bits hash values should be initialized with.
  7. init32 = offset32
  8. )
  9. // HashString32 returns the hash of s.
  10. func hashString32(s string) uint32 {
  11. return addString32(init32, s)
  12. }
  13. // AddString32 adds the hash of s to the precomputed hash value h.
  14. func addString32(h uint32, s string) uint32 {
  15. i := 0
  16. n := (len(s) / 8) * 8
  17. for i != n {
  18. h = (h ^ uint32(s[i])) * prime32
  19. h = (h ^ uint32(s[i+1])) * prime32
  20. h = (h ^ uint32(s[i+2])) * prime32
  21. h = (h ^ uint32(s[i+3])) * prime32
  22. h = (h ^ uint32(s[i+4])) * prime32
  23. h = (h ^ uint32(s[i+5])) * prime32
  24. h = (h ^ uint32(s[i+6])) * prime32
  25. h = (h ^ uint32(s[i+7])) * prime32
  26. i += 8
  27. }
  28. for _, c := range s[i:] {
  29. h = (h ^ uint32(c)) * prime32
  30. }
  31. return h
  32. }