hash.go 1.1 KB

1234567891011121314151617181920212223242526272829303132333435
  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. }