github.com/benchkram/bob@v0.0.0-20240314204020-b7a57f2f9be9/pkg/filehash/hash.go (about)

     1  package filehash
     2  
     3  import (
     4  	"fmt"
     5  	"io"
     6  	"os"
     7  
     8  	"github.com/cespare/xxhash/v2"
     9  )
    10  
    11  var (
    12  	hashFunc = xxhash.New
    13  )
    14  
    15  func Hash(file string) ([]byte, error) {
    16  	f, err := os.Open(file)
    17  	if err != nil {
    18  		return nil, fmt.Errorf("failed to open: %w", err)
    19  	}
    20  	defer f.Close()
    21  
    22  	return HashBytes(io.Reader(f))
    23  }
    24  
    25  func HashBytes(r io.Reader) ([]byte, error) {
    26  	h := hashFunc()
    27  	if _, err := io.Copy(h, r); err != nil {
    28  		return nil, fmt.Errorf("failed to copy: %w", err)
    29  	}
    30  
    31  	return h.Sum(nil), nil
    32  }