github.com/onflow/flow-go@v0.33.17/ledger/complete/wal/checksum.go (about)

     1  package wal
     2  
     3  import (
     4  	"fmt"
     5  	"hash"
     6  	"hash/crc32"
     7  	"io"
     8  )
     9  
    10  var crc32Table = crc32.MakeTable(crc32.Castagnoli)
    11  
    12  type Crc32Writer struct {
    13  	hash   hash.Hash32
    14  	Writer io.Writer
    15  }
    16  
    17  func NewCRC32Writer(writer io.Writer) *Crc32Writer {
    18  	return &Crc32Writer{
    19  		hash:   crc32.New(crc32Table),
    20  		Writer: writer,
    21  	}
    22  }
    23  
    24  func (c *Crc32Writer) Write(p []byte) (n int, err error) {
    25  
    26  	// hash.Write never fails, but who knows
    27  	n, err = c.hash.Write(p)
    28  	if err != nil {
    29  		return n, fmt.Errorf("error while calculating crc32: %w", err)
    30  	}
    31  
    32  	return c.Writer.Write(p)
    33  }
    34  
    35  func (c *Crc32Writer) Crc32() uint32 {
    36  	return c.hash.Sum32()
    37  }
    38  
    39  type Crc32Reader struct {
    40  	hash   hash.Hash32
    41  	reader io.Reader
    42  }
    43  
    44  func NewCRC32Reader(reader io.Reader) *Crc32Reader {
    45  	return &Crc32Reader{
    46  		hash:   crc32.New(crc32Table),
    47  		reader: reader,
    48  	}
    49  }
    50  
    51  func (c *Crc32Reader) Read(p []byte) (int, error) {
    52  
    53  	read, err := c.reader.Read(p)
    54  	if err != nil {
    55  		return read, fmt.Errorf("error while reading for crc32 sum: %w", err)
    56  	}
    57  	_, err = c.hash.Write(p[:read])
    58  	if err != nil {
    59  		return 0, fmt.Errorf("error while calculating crc32: %w", err)
    60  	}
    61  
    62  	return read, err
    63  }
    64  
    65  func (c *Crc32Reader) Crc32() uint32 {
    66  	return c.hash.Sum32()
    67  }