github.com/evanw/esbuild@v0.21.4/internal/xxhash/xxhash_other.go (about)

     1  package xxhash
     2  
     3  // Sum64 computes the 64-bit xxHash digest of b.
     4  func Sum64(b []byte) uint64 {
     5  	// A simpler version would be
     6  	//   d := New()
     7  	//   d.Write(b)
     8  	//   return d.Sum64()
     9  	// but this is faster, particularly for small inputs.
    10  
    11  	n := len(b)
    12  	var h uint64
    13  
    14  	if n >= 32 {
    15  		v1 := prime1v + prime2
    16  		v2 := prime2
    17  		v3 := uint64(0)
    18  		v4 := -prime1v
    19  		for len(b) >= 32 {
    20  			v1 = round(v1, u64(b[0:8:len(b)]))
    21  			v2 = round(v2, u64(b[8:16:len(b)]))
    22  			v3 = round(v3, u64(b[16:24:len(b)]))
    23  			v4 = round(v4, u64(b[24:32:len(b)]))
    24  			b = b[32:len(b):len(b)]
    25  		}
    26  		h = rol1(v1) + rol7(v2) + rol12(v3) + rol18(v4)
    27  		h = mergeRound(h, v1)
    28  		h = mergeRound(h, v2)
    29  		h = mergeRound(h, v3)
    30  		h = mergeRound(h, v4)
    31  	} else {
    32  		h = prime5
    33  	}
    34  
    35  	h += uint64(n)
    36  
    37  	i, end := 0, len(b)
    38  	for ; i+8 <= end; i += 8 {
    39  		k1 := round(0, u64(b[i:i+8:len(b)]))
    40  		h ^= k1
    41  		h = rol27(h)*prime1 + prime4
    42  	}
    43  	if i+4 <= end {
    44  		h ^= uint64(u32(b[i:i+4:len(b)])) * prime1
    45  		h = rol23(h)*prime2 + prime3
    46  		i += 4
    47  	}
    48  	for ; i < end; i++ {
    49  		h ^= uint64(b[i]) * prime5
    50  		h = rol11(h) * prime1
    51  	}
    52  
    53  	h ^= h >> 33
    54  	h *= prime2
    55  	h ^= h >> 29
    56  	h *= prime3
    57  	h ^= h >> 32
    58  
    59  	return h
    60  }
    61  
    62  func writeBlocks(d *Digest, b []byte) int {
    63  	v1, v2, v3, v4 := d.v1, d.v2, d.v3, d.v4
    64  	n := len(b)
    65  	for len(b) >= 32 {
    66  		v1 = round(v1, u64(b[0:8:len(b)]))
    67  		v2 = round(v2, u64(b[8:16:len(b)]))
    68  		v3 = round(v3, u64(b[16:24:len(b)]))
    69  		v4 = round(v4, u64(b[24:32:len(b)]))
    70  		b = b[32:len(b):len(b)]
    71  	}
    72  	d.v1, d.v2, d.v3, d.v4 = v1, v2, v3, v4
    73  	return n - len(b)
    74  }