github.com/weaviate/weaviate@v1.24.6/adapters/repos/db/lsmkv/rwhasher/writer.go (about)

     1  //                           _       _
     2  // __      _____  __ ___   ___  __ _| |_ ___
     3  // \ \ /\ / / _ \/ _` \ \ / / |/ _` | __/ _ \
     4  //  \ V  V /  __/ (_| |\ V /| | (_| | ||  __/
     5  //   \_/\_/ \___|\__,_| \_/ |_|\__,_|\__\___|
     6  //
     7  //  Copyright © 2016 - 2024 Weaviate B.V. All rights reserved.
     8  //
     9  //  CONTACT: hello@weaviate.io
    10  //
    11  
    12  package rwhasher
    13  
    14  import (
    15  	"hash"
    16  	"hash/crc32"
    17  	"io"
    18  )
    19  
    20  type WriterHasher interface {
    21  	io.Writer
    22  	N() int
    23  	Hash() []byte
    24  	Reset()
    25  }
    26  
    27  var _ WriterHasher = (*CRC32Writer)(nil)
    28  
    29  type CRC32Writer struct {
    30  	w    io.Writer
    31  	n    int
    32  	hash hash.Hash32
    33  }
    34  
    35  func NewCRC32Writer(w io.Writer) *CRC32Writer {
    36  	return &CRC32Writer{
    37  		w:    w,
    38  		hash: crc32.NewIEEE(),
    39  	}
    40  }
    41  
    42  func (wc *CRC32Writer) Write(p []byte) (n int, err error) {
    43  	n, err = wc.w.Write(p)
    44  	wc.n += n
    45  	wc.hash.Write(p[:n])
    46  	return n, err
    47  }
    48  
    49  func (wc *CRC32Writer) N() int {
    50  	return wc.n
    51  }
    52  
    53  func (wc *CRC32Writer) Hash() []byte {
    54  	return wc.hash.Sum(nil)
    55  }
    56  
    57  func (wc *CRC32Writer) Reset() {
    58  	wc.n = 0
    59  	wc.hash.Reset()
    60  }