hash.go 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. // Copyright 2019+ Klaus Post. All rights reserved.
  2. // License information can be found in the LICENSE file.
  3. // Based on work by Yann Collet, released under BSD License.
  4. package zstd
  5. const (
  6. prime3bytes = 506832829
  7. prime4bytes = 2654435761
  8. prime5bytes = 889523592379
  9. prime6bytes = 227718039650203
  10. prime7bytes = 58295818150454627
  11. prime8bytes = 0xcf1bbcdcb7a56463
  12. )
  13. // hashLen returns a hash of the lowest mls bytes of with length output bits.
  14. // mls must be >=3 and <=8. Any other value will return hash for 4 bytes.
  15. // length should always be < 32.
  16. // Preferably length and mls should be a constant for inlining.
  17. func hashLen(u uint64, length, mls uint8) uint32 {
  18. switch mls {
  19. case 3:
  20. return (uint32(u<<8) * prime3bytes) >> (32 - length)
  21. case 5:
  22. return uint32(((u << (64 - 40)) * prime5bytes) >> (64 - length))
  23. case 6:
  24. return uint32(((u << (64 - 48)) * prime6bytes) >> (64 - length))
  25. case 7:
  26. return uint32(((u << (64 - 56)) * prime7bytes) >> (64 - length))
  27. case 8:
  28. return uint32((u * prime8bytes) >> (64 - length))
  29. default:
  30. return (uint32(u) * prime4bytes) >> (32 - length)
  31. }
  32. }
  33. // hash3 returns the hash of the lower 3 bytes of u to fit in a hash table with h bits.
  34. // Preferably h should be a constant and should always be <32.
  35. func hash3(u uint32, h uint8) uint32 {
  36. return ((u << (32 - 24)) * prime3bytes) >> ((32 - h) & 31)
  37. }