Skip to content
Snippets Groups Projects
Select Git revision
  • 3e81f2cf1500a3589d8236bd04e6ad52534e7f60
  • master default protected
  • 0.5.9
  • 0.5.8
  • 0.5.7
  • 0.5.6
  • 0.5.5
  • 0.5.4
  • 0.5.3
  • 0.5.2
  • 0.5.1
  • 0.5.0
  • 0.4.17
  • 0.4.16
  • 0.4.15
  • 0.4.14
  • 0.4.13
  • 0.4.12
  • 0.4.11
  • 0.4.10
  • 0.4.9
  • 0.4.8
22 results

xxhash.go

Blame
  • xxhash.go 5.28 KiB
    // Package xxhash implements the 64-bit variant of xxHash (XXH64) as described
    // at http://cyan4973.github.io/xxHash/.
    package xxhash
    
    import (
    	"encoding/binary"
    	"errors"
    	"math/bits"
    )
    
    const (
    	prime1 uint64 = 11400714785074694791
    	prime2 uint64 = 14029467366897019727
    	prime3 uint64 = 1609587929392839161
    	prime4 uint64 = 9650029242287828579
    	prime5 uint64 = 2870177450012600261
    )
    
    // NOTE(caleb): I'm using both consts and vars of the primes. Using consts where
    // possible in the Go code is worth a small (but measurable) performance boost
    // by avoiding some MOVQs. Vars are needed for the asm and also are useful for
    // convenience in the Go code in a few places where we need to intentionally
    // avoid constant arithmetic (e.g., v1 := prime1 + prime2 fails because the
    // result overflows a uint64).
    var (
    	prime1v = prime1
    	prime2v = prime2
    	prime3v = prime3
    	prime4v = prime4
    	prime5v = prime5
    )
    
    // Digest implements hash.Hash64.
    type Digest struct {
    	v1    uint64
    	v2    uint64
    	v3    uint64
    	v4    uint64
    	total uint64
    	mem   [32]byte
    	n     int // how much of mem is used
    }
    
    // New creates a new Digest that computes the 64-bit xxHash algorithm.
    func New() *Digest {
    	var d Digest
    	d.Reset()
    	return &d
    }
    
    // Reset clears the Digest's state so that it can be reused.
    func (d *Digest) Reset() {
    	d.v1 = prime1v + prime2
    	d.v2 = prime2
    	d.v3 = 0
    	d.v4 = -prime1v
    	d.total = 0
    	d.n = 0
    }
    
    // Size always returns 8 bytes.
    func (d *Digest) Size() int { return 8 }
    
    // BlockSize always returns 32 bytes.
    func (d *Digest) BlockSize() int { return 32 }
    
    // Write adds more data to d. It always returns len(b), nil.
    func (d *Digest) Write(b []byte) (n int, err error) {
    	n = len(b)
    	d.total += uint64(n)