github.com/bir3/gocompiler@v0.9.2202/extra/compress/zstd/hash.go (about)

     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  
     5  package zstd
     6  
     7  const (
     8  	prime3bytes = 506832829
     9  	prime4bytes = 2654435761
    10  	prime5bytes = 889523592379
    11  	prime6bytes = 227718039650203
    12  	prime7bytes = 58295818150454627
    13  	prime8bytes = 0xcf1bbcdcb7a56463
    14  )
    15  
    16  // hashLen returns a hash of the lowest mls bytes of with length output bits.
    17  // mls must be >=3 and <=8. Any other value will return hash for 4 bytes.
    18  // length should always be < 32.
    19  // Preferably length and mls should be a constant for inlining.
    20  func hashLen(u uint64, length, mls uint8) uint32 {
    21  	switch mls {
    22  	case 3:
    23  		return (uint32(u<<8) * prime3bytes) >> (32 - length)
    24  	case 5:
    25  		return uint32(((u << (64 - 40)) * prime5bytes) >> (64 - length))
    26  	case 6:
    27  		return uint32(((u << (64 - 48)) * prime6bytes) >> (64 - length))
    28  	case 7:
    29  		return uint32(((u << (64 - 56)) * prime7bytes) >> (64 - length))
    30  	case 8:
    31  		return uint32((u * prime8bytes) >> (64 - length))
    32  	default:
    33  		return (uint32(u) * prime4bytes) >> (32 - length)
    34  	}
    35  }