Murmurhash-go源码阅读

本文详细探讨了Murmurhash-go的源码实现,特别关注128位算法的TestRefStrings测试。文章指出该实现是原生Go代码,不依赖C/C++库,使用Go标准库完成。通过分析代码,解释了digest128结构体的设计,以及bmixer的作用。此外,介绍了字符串输入、位运算和更新digest的过程。最后,讨论了Murmurhash的高效性源于位运算,并提到特定常数值是经过实验得出的,但具体原因无详细资料说明。
摘要由CSDN通过智能技术生成

源码地址:
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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值