# 从Cerber勒索软件中学习murmurhash算法

Murmur hash算法介绍
MurmurHash是一种非加密型哈希函数，适用于一般的哈希检索操作。 由Austin Appleby在2008年发明，并出现了多个变种，都已经发布到了公有领域。与其它流行的哈希函数相比，对于规律性较强的key，MurmurHash的随机分布特征表现更良好。当前的版本是MurmurHash3，能够产生出32-bit或128-bit哈希值。

Murmur hash 算法实现

[Python] 纯文本查看 复制代码
?

def murmur3_x86_32(data, seed=0):[/size][/align][size=4] c1 = 0xcc9e2d51
c2 = 0x1b873593
r1 = 15
r2 = 13
m = 5
n = 0xe6546b64

length = len(data)
h1 = seed
rounded_end = (length & 0xfffffffc)  # every block contain 4 bytes
for i in range(0, rounded_end, 4):
# translate to little endian load order
k1 = (ord(data[i]) & 0xff) | ((ord(data[i + 1]) & 0xff) << 8) | \
((ord(data[i + 2]) & 0xff) << 16) | (ord(data[i + 3]) << 24)
k1 *= c1
k1 = (k1 << r1) | ((k1 & 0xffffffff) >> (32-r1))  # ROTL32(k1,15)
k1 *= c2

h1 ^= k1
h1 = (h1 << r2) | ((h1 & 0xffffffff) >> (32-r2))  # ROTL32(h1,13)
h1 = h1 * m + n

# the last block which is < 4 bytes
k1 = 0

val = length & 0x03
# the last block is  3 bytes
if val == 3:
k1 = (ord(data[rounded_end + 2]) & 0xff) << 16
# the last block is  2 bytes
if val in [2, 3]:
k1 |= (ord(data[rounded_end + 1]) & 0xff) << 8
# the last block is  1 bytes
if val in [1, 2, 3]:
k1 |= ord(data[rounded_end]) & 0xff  # translate to little endian load order
k1 *= c1
k1 = (k1 << r1) | ((k1 & 0xffffffff) >> (32-r1))
k1 *= c2
h1 ^= k1

# finalization
h1 ^= length
h1 ^= ((h1 & 0xffffffff) >> 16)
h1 *= 0x85ebca6b
h1 ^= ((h1 & 0xffffffff) >> 13)
h1 *= 0xc2b2ae35
h1 ^= ((h1 & 0xffffffff) >> 16)
# for 32 bit, get the last 32 bits
return h1 & 0xffffffff


………………………………………………………………………………………………..略，

#### redis中几种哈希函数的研究

2014-01-16 18:09:12

#### Murmurhash介绍与实现

2014-05-25 13:44:20

#### 分布式一致性Hash算法实现java版

2015-04-28 18:49:26

#### murmur:更快更好的哈希函数（字符串转64位hash值）

2011-12-27 09:42:31

#### MurmurHash算法

2015-03-17 12:07:20

#### MurmurHash PK CityHash

2012-03-14 21:08:06

#### 原始版本的murmurhash2算法

2016-01-27 13:51:37

#### 史上最强算法论战：请不要嘻哈，这是哈希

2015-06-28 15:53:04

#### MurmurHash

2016-07-04 17:01:15

#### MurmurHash3

2017-03-25 10:37:34