golang 性能优化之累加hash

栏目: Go · 发布时间: 6年前

内容简介:很多时候性能问题总是发生在一些不起眼的地方。最近做一个性能问题分析的时候发现,一个函数里面使用由于字符串拼接产生的临时字符串导致内存上涨了40%(120G 内存的机器),而这些临时字符串给 GC 也带来了非常大的负担,成为主要的性能瓶颈,而这些字符串作为 map 的 key,又必须要拼接,所以想到了直接使用 hash 后的值作为 map 的 key,而这个 hash 值使用累加 hash 计算得出。所谓累加 hash,就是对字符串的 hash 可以分为任意多段,对每一段连续 hash,结果累加,对于任意一

很多时候性能问题总是发生在一些不起眼的地方。最近做一个性能问题分析的时候发现,一个函数里面使用由于字符串拼接产生的临时字符串导致内存上涨了40%(120G 内存的机器),而这些临时字符串给 GC 也带来了非常大的负担,成为主要的性能瓶颈,而这些字符串作为 map 的 key,又必须要拼接,所以想到了直接使用 hash 后的值作为 map 的 key,而这个 hash 值使用累加 hash 计算得出。

所谓累加 hash,就是对字符串的 hash 可以分为任意多段,对每一段连续 hash,结果累加,对于任意一种分段方式,最后能得到一致的 hash 结果,比如:H.hash("hello world"), H.hash("hello").hash(" ").hash("world"), H.hash("hello wo").hash("rld)" 这些结果最后都应该是一致的,利用这个特性,就能做到对多个字符串哈希而不用拼接

BKDR hash 实现

type StringHasherBKDR uint64

// NewStringHasherBKDR 创建一个新的 Hasher
func NewStringHasherBKDR() StringHasherBKDR {
 return StringHasherBKDR(0)
}

// AddStr 增加一个字符串
func (bkdr StringHasherBKDR) AddStr(str string) StringHasherBKDR {
    val := uint64(bkdr)
 for i := 0; i < len(str); i++ {
        val = val*131 + uint64(str[i])
 }
 return StringHasherBKDR(val)
}

// AddInt 添加一个 int 值
func (bkdr StringHasherBKDR) AddInt(i uint64) StringHasherBKDR {
    val := uint64(bkdr)
    val = val*131 + i
 return StringHasherBKDR(val)
}

// Val 转成 uint64 的值
func (bkdr StringHasherBKDR) Val() uint64 {
 return uint64(bkdr)
}

使用上也很简单

hasher := NewStringHasherBKDR()
So(hasher.AddStr("hello world").Val(), ShouldEqual, hasher.AddStr("hello").AddStr(" ").AddStr("world").Val())

添加客服微信:grey0805,共享更多精彩!


以上所述就是小编给大家介绍的《golang 性能优化之累加hash》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

The Four

The Four

Scott Galloway / Portfolio / 2017-10-3 / USD 28.00

NEW YORK TIMES BESTSELLER USA TODAY BESTSELLER Amazon, Apple, Facebook, and Google are the four most influential companies on the planet. Just about everyone thinks they know how they got there.......一起来看看 《The Four》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

MD5 加密
MD5 加密

MD5 加密工具