rabin.go 790 Bytes
Newer Older
1 2 3
package chunk

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 14
	r      *chunker.Chunker
	reader io.Reader
15 16
}

17 18 19
func NewRabin(r io.Reader, avgBlkSize uint64) *Rabin {
	min := avgBlkSize / 3
	max := avgBlkSize + (avgBlkSize / 2)
20

21
	return NewRabinMinMax(r, min, avgBlkSize, max)
22
}
23

24 25 26
func NewRabinMinMax(r io.Reader, min, avg, max uint64) *Rabin {
	h := fnv.New32a()
	ch := chunker.New(r, IpfsRabinPoly, h, avg, min, max)
27

28
	return &Rabin{
29 30
		r:      ch,
		reader: r,
31 32
	}
}
33

34 35 36 37 38
func (r *Rabin) NextBytes() ([]byte, error) {
	ch, err := r.r.Next()
	if err != nil {
		return nil, err
	}
39

40
	return ch.Data, nil
41
}
42 43 44 45

func (r *Rabin) Reader() io.Reader {
	return r.reader
}