github.com/keltia/go-ipfs@v0.3.8-0.20150909044612-210793031c63/importer/chunk/rabin.go (about) 1 package chunk 2 3 import ( 4 "hash/fnv" 5 "io" 6 7 "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/whyrusleeping/chunker" 8 ) 9 10 var IpfsRabinPoly = chunker.Pol(17437180132763653) 11 12 type Rabin struct { 13 r *chunker.Chunker 14 } 15 16 func NewRabin(r io.Reader, avgBlkSize uint64) *Rabin { 17 min := avgBlkSize / 3 18 max := avgBlkSize + (avgBlkSize / 2) 19 20 return NewRabinMinMax(r, min, avgBlkSize, max) 21 } 22 23 func NewRabinMinMax(r io.Reader, min, avg, max uint64) *Rabin { 24 h := fnv.New32a() 25 ch := chunker.New(r, IpfsRabinPoly, h, avg, min, max) 26 27 return &Rabin{ 28 r: ch, 29 } 30 } 31 32 func (r *Rabin) NextBytes() ([]byte, error) { 33 ch, err := r.r.Next() 34 if err != nil { 35 return nil, err 36 } 37 38 return ch.Data, nil 39 }