// NewCustom returns a new ImoHash using the provided sample size // and sample threshhold values. The entire file will be hashed // (i.e. no sampling), if sampleSize < 1. func NewCustom(sampleSize, sampleThreshold int) ImoHash { h := ImoHash{ hasher: murmur3.New128(), sampleSize: sampleSize, sampleThreshold: sampleThreshold, } return h }
func GenerateBlockID(inodeID []byte, block uint64) []byte { h := murmur3.New128() h.Write(inodeID) binary.Write(h, binary.BigEndian, block) s1, s2 := h.Sum128() b := bytes.NewBuffer([]byte("")) binary.Write(b, binary.BigEndian, s1) binary.Write(b, binary.BigEndian, s2) return b.Bytes() }
// baseHashes returns the four hash values of data that are used to create k // hashes func baseHashes(data []byte) [4]uint64 { a1 := []byte{1} // to grab another bit of data hasher := murmur3.New128() hasher.Write(data) v1, v2 := hasher.Sum128() hasher.Write(a1) v3, v4 := hasher.Sum128() return [4]uint64{ v1, v2, v3, v4, } }
// M generates n bytes of pseudo-random data according to the // method described in the imohash algorithm description. func M(n int) []byte { r := make([]byte, 0, n) hasher := murmur3.New128() for len(r) < n { hasher.Write([]byte{'A'}) r = hasher.Sum(r) } return r[0:n] }
func GetID(fsid []byte, inode, block uint64) []byte { // TODO: Figure out what arrangement we want to use for the hash h := murmur3.New128() h.Write(fsid) binary.Write(h, binary.BigEndian, inode) binary.Write(h, binary.BigEndian, block) s1, s2 := h.Sum128() b := bytes.NewBuffer([]byte("")) binary.Write(b, binary.BigEndian, s1) binary.Write(b, binary.BigEndian, s2) return b.Bytes() }