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 }