1package murmur3 2 3import ( 4 "hash" 5) 6 7// Make sure interfaces are correctly implemented. 8var ( 9 _ hash.Hash = new(digest64) 10 _ hash.Hash64 = new(digest64) 11 _ bmixer = new(digest64) 12) 13 14// digest64 is half a digest128. 15type digest64 digest128 16 17// New64 returns a 64-bit hasher 18func New64() hash.Hash64 { return New64WithSeed(0) } 19 20// New64WithSeed returns a 64-bit hasher set with explicit seed value 21func New64WithSeed(seed uint32) hash.Hash64 { 22 d := (*digest64)(New128WithSeed(seed).(*digest128)) 23 return d 24} 25 26func (d *digest64) Sum(b []byte) []byte { 27 h1 := d.Sum64() 28 return append(b, 29 byte(h1>>56), byte(h1>>48), byte(h1>>40), byte(h1>>32), 30 byte(h1>>24), byte(h1>>16), byte(h1>>8), byte(h1)) 31} 32 33func (d *digest64) Sum64() uint64 { 34 h1, _ := (*digest128)(d).Sum128() 35 return h1 36} 37 38// Sum64 returns the MurmurHash3 sum of data. It is equivalent to the 39// following sequence (without the extra burden and the extra allocation): 40// hasher := New64() 41// hasher.Write(data) 42// return hasher.Sum64() 43func Sum64(data []byte) uint64 { return Sum64WithSeed(data, 0) } 44 45// Sum64WithSeed returns the MurmurHash3 sum of data. It is equivalent to the 46// following sequence (without the extra burden and the extra allocation): 47// hasher := New64WithSeed(seed) 48// hasher.Write(data) 49// return hasher.Sum64() 50func Sum64WithSeed(data []byte, seed uint32) uint64 { 51 d := &digest128{h1: uint64(seed), h2: uint64(seed)} 52 d.seed = seed 53 d.tail = d.bmix(data) 54 d.clen = len(data) 55 h1, _ := d.Sum128() 56 return h1 57} 58