源码地址:
https://github.com/spaolacci/murmur3
如何理解它说的原生go实现:底层实现不依赖c和c++的库,只用go的标准库实现。
分析一下TestRefStrings中的对于128位的murmur3算法进行分析
// New128WithSeed returns a 128-bit hasher set with explicit seed value
func New128WithSeed(seed uint32) Hash128 {
d := new(digest128)
d.seed = seed
d.bmixer = d // 这里有点奇怪
d.Reset()
return d
}
type digest128 struct {
digest
h1 uint64 // Unfinalized running hash part 1.
h2 uint64 // Unfinalized running hash part 2.
}
type digest struct {
clen int // Digested input cumulative length.
tail []byte // 0 to Size()-1 bytes view of `buf'.
buf [16]byte // Expected (but not required) to be Size() large.
seed uint32 // Seed for initializing the hash.
bmixer
}
// 另外digest重写了bmixer的函数,先省略,等用的时候看。
type bmixer interface {
bmix(p []byte) (tail []byte)
Size() (n int)
reset()
}
type Hash128 interface {
hash.Hash
Sum128() (uint64, uint64)
}
看下这一段代码,很有意思,用var来保证digest128实现了所有的方法。
// Make sure interfaces are correctly implemented.
var (
_ hash.Hash = new(digest128)
_ Hash128 = new(digest128)
_ bmixer = new(digest128)
)
可以看到我们创建一个hasher,type=interface, 然后实现了各种各样的function。
关于
d.bmixer = d
这一行代码,这么写,猜测只是用来实现bmixer的方法。方便digest128 重写一系列函数。
murmur128.go
func