github.com/weaviate/weaviate@v1.24.6/adapters/repos/db/lsmkv/rwhasher/reader.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 ReaderHasher interface {
    21  	io.Reader
    22  	N() int
    23  	Hash() []byte
    24  	Reset()
    25  }
    26  
    27  var _ ReaderHasher = (*CRC32Reader)(nil)
    28  
    29  type CRC32Reader struct {
    30  	r    io.Reader
    31  	n    int
    32  	hash hash.Hash32
    33  }
    34  
    35  func NewCRC32Reader(r io.Reader) *CRC32Reader {
    36  	return &CRC32Reader{
    37  		r:    r,
    38  		hash: crc32.NewIEEE(),
    39  	}
    40  }
    41  
    42  func (rc *CRC32Reader) Read(p []byte) (n int, err error) {
    43  	n, err = rc.r.Read(p)
    44  	rc.n += n
    45  	rc.hash.Write(p[:n])
    46  	return n, err
    47  }
    48  
    49  func (rc *CRC32Reader) N() int {
    50  	return rc.n
    51  }
    52  
    53  func (rc *CRC32Reader) Hash() []byte {
    54  	return rc.hash.Sum(nil)
    55  }
    56  
    57  func (rc *CRC32Reader) Reset() {
    58  	rc.n = 0
    59  	rc.hash.Reset()
    60  }