github.com/balzaczyy/golucene@v0.0.0-20151210033525-d0be9ee89713/core/store/bufferedChecksum.go (about) 1 package store 2 3 import ( 4 "hash" 5 ) 6 7 /* 8 Wraps another Checksum with an internal buffer to speed up checksum 9 calculations. 10 */ 11 type BufferedChecksum struct { 12 in hash.Hash32 13 buffer []byte 14 upto int 15 } 16 17 /* Create a new BufferedChecksum with DEFAULT_BUFFERSIZE */ 18 func newBufferedChecksum(in hash.Hash32) *BufferedChecksum { 19 return newBufferedChecksumWithBuffer(in, 256) 20 } 21 22 /* Create a new BufferedChecksum with the specified bufferSize */ 23 func newBufferedChecksumWithBuffer(in hash.Hash32, bufferSize int) *BufferedChecksum { 24 return &BufferedChecksum{in: in, buffer: make([]byte, bufferSize)} 25 } 26 27 func (bc *BufferedChecksum) BlockSize() int { 28 return bc.in.BlockSize() 29 } 30 31 func (bc *BufferedChecksum) Reset() { 32 bc.upto = 0 33 bc.in.Reset() 34 } 35 36 func (bc *BufferedChecksum) Size() int { 37 return bc.in.Size() 38 } 39 40 func (bc *BufferedChecksum) Sum(p []byte) []byte { 41 return bc.in.Sum(p) 42 } 43 44 func (bc *BufferedChecksum) Sum32() uint32 { 45 bc.flush() 46 return bc.in.Sum32() 47 } 48 49 func (bc *BufferedChecksum) flush() { 50 if bc.upto > 0 { 51 bc.in.Write(bc.buffer[:bc.upto]) 52 } 53 bc.upto = 0 54 } 55 56 func (bc *BufferedChecksum) Write(p []byte) (int, error) { 57 if len(p) >= len(bc.buffer) { 58 bc.flush() 59 return bc.in.Write(p) 60 } 61 if bc.upto+len(p) > len(bc.buffer) { 62 bc.flush() 63 } 64 copy(bc.buffer, p) 65 bc.upto += len(p) 66 return len(p), nil 67 }