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  }