Chinaunix首页 | 论坛 | 博客
  • 博客访问: 159589
  • 博文数量: 34
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 378
  • 用 户 组: 普通用户
  • 注册时间: 2017-01-17 11:19
个人简介

人的一生犹如负重致远,不可急躁。 以不自由为常事,则不觉不足。 心生欲望时,应回顾贫困之日。 心怀宽恕,视怒如敌,则能无视长久。 只知胜而不知敗,必害其身。 责人不如责己,不及胜于过之。

文章分类

全部博文(34)

文章存档

2018年(2)

2017年(32)

我的朋友

分类: IT职场

2017-03-13 18:03:48

MurmurHash

1  MurmurHash简介

Murmur英文 (multiply and rotate) and (multiply and rotate),MurmurHash 是一种非加密型哈希函数,适用于一般的哈希检索操作。由Austin Appleby2008年发明,并出现了多个变种,都已经发布到了公有领域(public domain)。与其它流行的哈希函数相比,对于规律性较强的keyMurmurHash的随机分布特征表现更良好。

Austin Appleby被邀到google工作, MurmurHash3算法是最新版本,基于MurmurHash2改进了一些小瑕疵,使得速度更快,实现了32位(低延时)、128HashKey,尤其对大块的数据,具有较高的平衡性与低碰撞率。

2  MurmurHash的应用

Redis在实现字典时用到了两种不同的哈希算法,MurmurHash便是其中一种(另一种是djb),在Redis中应用十分广泛,包括数据库、集群、哈希键、阻塞操作等功能都用到了这个算法。

Cassandra的数据模型以及Partition Key,同时Cassandra维护了一个令牌环,这样当写入一条数据或者需要读取数据的时候,就知道首先去哪一台机器执行相应的操作。在底层支撑令牌的算法,就是默默无闻但是几乎一统江湖的MurmurHash算法。

如Hadoop、libstdc++、nginx、libmemcached、常见的大数据库底层,都使用了这个MurmurHash算法作为底层的存储算法。

3  实现代码

MurmurHash2实现代码:

uint32_t MurmurHash2 ( const void * key, int len, uint32_t seed )

{ 

// 'm' and 'r' are mixing constants generated offline. 

// They're not really 'magic', they just happen to work well. 

const uint32_t m = 0x5bd1e995; 

const int r = 24; 

// Initialize the hash to a 'random' value 

uint32_t h = seed ^ len; 

 

// Mix 4 bytes at a time into the hash 

const unsigned char * data = (const unsigned char *)key; 

 

while(len >= 4) 

{ 

uint32_t k = *(uint32_t*)data; 

 

k *= m; 

k ^= k >> r; 

k *= m; 

 

h *= m; 

h ^= k; 

 

data += 4; 

len -= 4; 

} 

// Handle the last few bytes of the input array 

switch(len) 

{ 

case 3: h ^= data[2] << 16; 

case 2: h ^= data[1] << 8; 

case 1: h ^= data[0]; 

h *= m; 

}; 

// Do a few final mixes of the hash to ensure the last few 

// bytes are well-incorporated. 

 

h ^= h >> 13; 

h *= m; 

h ^= h >> 15; 

 

return h; 

}

 

 

 

 

 

 

 

 

参考链接:

http://blog.csdn.net/xyblog/article/details/50593648

http://blog.csdn.net/uniqsa/article/details/53586022

 

http://www.blogjava.net/hello-yun/archive/2012/10/10/389289.html

 

 

阅读(1061) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~