golang有用的库及工具 之 字符串转换 获取32位 uint32位hash 方法 MurmurHash哈希
来源:互联网 发布:微信小程序分销源码 编辑:程序博客网 时间:2024/05/19 02:17
MurmurHash 是一种非加密型哈希函数,适用于一般的哈希检索操作。由Austin Appleby在2008年发明,并出现了多个变种,都已经发布到了公有领域(public domain)。与其它流行的哈希函数相比,对于规律性较强的key,MurmurHash的随机分布特征表现更良好。
const ( c1_32 uint32 = 0xcc9e2d51 c2_32 uint32 = 0x1b873593)// GetHash returns a murmur32 hash for the data slice.func GetHash(data []byte) uint32 { // Seed is set to 37, same as C# version of emitter var h1 uint32 = 37 nblocks := len(data) / 4 var p uintptr if len(data) > 0 { p = uintptr(unsafe.Pointer(&data[0])) } p1 := p + uintptr(4*nblocks) for ; p < p1; p += 4 { k1 := *(*uint32)(unsafe.Pointer(p)) k1 *= c1_32 k1 = (k1 << 15) | (k1 >> 17) // rotl32(k1, 15) k1 *= c2_32 h1 ^= k1 h1 = (h1 << 13) | (h1 >> 19) // rotl32(h1, 13) h1 = h1*5 + 0xe6546b64 } tail := data[nblocks*4:] var k1 uint32 switch len(tail) & 3 { case 3: k1 ^= uint32(tail[2]) << 16 fallthrough case 2: k1 ^= uint32(tail[1]) << 8 fallthrough case 1: k1 ^= uint32(tail[0]) k1 *= c1_32 k1 = (k1 << 15) | (k1 >> 17) // rotl32(k1, 15) k1 *= c2_32 h1 ^= k1 } h1 ^= uint32(len(data)) h1 ^= h1 >> 16 h1 *= 0x85ebca6b h1 ^= h1 >> 13 h1 *= 0xc2b2ae35 h1 ^= h1 >> 16 return (h1 << 24) | (((h1 >> 8) << 16) & 0xFF0000) | (((h1 >> 16) << 8) & 0xFF00) | (h1 >> 24)}
测试:
func TestGetHash2(t *testing.T) { h := GetHash([]byte("hello world")) if h != 4008393376 { t.Errorf("Hash %d is not equal to %d", h, 1815237614) }}
总结:这个方法可以用于 内存中字符串 映射为 32位int型 数字,以提高内存的使用映射率
阅读全文
0 0
- golang有用的库及工具 之 字符串转换 获取32位 uint32位hash 方法 MurmurHash哈希
- golang有用的库及工具 之 sync.Pool改造
- golang有用的库及工具 之 一致性哈希(Consistent Hashing)算法
- golang有用的库及工具 之 zap.Logger包 使用
- golang有用的库及工具 之 缓存淘汰算法--LRU算法
- golang有用的库及工具 之 fasthttp客户端 最通用最有效最简单使用方式
- 有用的位运算
- 有用的位运算
- 实现1位,4位,8位,24位BMP位图的互相转换的方法,32位转24位
- golang获取当前时间、时间戳和时间字符串及它们之间的相互转换
- 获取int值的完整32位字符串(1)
- 获取int值的完整32位字符串(2)
- 获取int值的完整32位字符串(3)
- C字符串 与 uint32类型互相转换
- 64位的ubuntu14.04 LTS安装 Linux交叉编译工具链及32位“ia32-libs”依赖库
- 一些有用的位操作
- 24位真彩色图像转换为16位高彩色图像的实现方法及效果改进
- 求32位数中有几位非0位及最低非0位和最高非0位的方法
- Java多线程学习(吐血超详细总结)
- linux x86-64进程运行空间分析
- thinkPHP分页实例及详解
- 将MyEclipse项目导入eclipse中
- 【运动小记】2017.10~2018.10
- golang有用的库及工具 之 字符串转换 获取32位 uint32位hash 方法 MurmurHash哈希
- 2936: [Poi1999]降 水
- vue步骤型表单缓存上一步页面
- 安卓获取res下的资源文件:string字符串、color颜色、dimen尺寸、array数组、drawable图片和xml、anim/animator动画、raw媒体、assets资源
- springboot 下将shiro-cas替换为buji-pac4j
- Java常见集合框架(十八): Deque之Deque、BlockingDeque、LinkedBlockingDeque、ArrayDeque
- Linux中vim显示乱码问题
- PAT乙级目录
- Curator之Leader选举