2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
# File 'lib/bloom.rb', line 2
def murmurhash3(key, seed)
c1 = 0xcc9e2d51
c2 = 0x1b873593
r1 = 15
r2 = 13
m = 5
n = 0xe6546b64
filter_32 = 0xFFFFFFFF
len = key.length
hash = seed
nblocks = (len / 4)
blocks = key
bytes = key.unpack('L*')
for i in 0..nblocks-1 do
k = bytes[i]
k = (k * c1) & filter_32
k = (k << r1) | (k >> (32 - r1))
k = (k * c2) & filter_32
hash ^= k
hash = ((hash << r2) | (hash >> (32 - r2)))
hash = (hash * m + n) & filter_32
end
k1 = 0
bytes = key.unpack('C*')
if len % 4 == 3
k1 ^= (bytes[-1] << 16)
k1 ^= (bytes[-2] << 8)
k1 ^= (bytes[-3])
end
if len % 4 == 2
k1 ^= (bytes[-1] << 8)
k1 ^= (bytes[-2])
end
if len % 4 == 1
k1 ^= bytes[-1]
end
if len % 4 != 0
k1 = (k1 * c1) & filter_32
k1 = ((k1 << r1) | (k1 >> (32 - r1))) & filter_32
k1 = (k1 * c2) & filter_32
hash ^= k1
end
p hash
hash ^= key.length
hash &= filter_32
hash ^= (hash >> 16)
hash = (hash * 0x85ebca6b) & filter_32
hash ^= (hash >> 13)
hash &= filter_32
hash = (hash * 0xc2b2ae35) & filter_32
hash ^= (hash >> 16)
hash &= filter_32
return hash
end
|