-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmurmurhash3.js
79 lines (73 loc) · 1.98 KB
/
murmurhash3.js
1
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
71
72
73
74
75
76
77
78
79
const long = require('./long.js')
const multiply = long.multiply
const xor = long.xor
const shiftRightUnsigned = long.shiftRightUnsigned
const copy = long.copy
// Ported from https://github.com/v8/v8/blob/a3b02dc76d8e8f4e4ee3848fe1e6c009952fc24b/src/base/utils/random-number-generator.cc#L222-L229
const Multiply1 = { low: 0xFF51AFD7 | 0, high: 0xED558CCD | 0 }
const Multiply2 = { low: 0xC4CEB9FE | 0, high: 0x1A85EC53 | 0 }
const Temp = { low: 0 | 0, high: 0 | 0 }
const Temp2 = { low: 0 | 0, high: 0 | 0 }
function addChar (code, target, offset) {
var pos = offset % 8
if (pos === 0) {
Temp2.low = 0
Temp2.high = 0
}
if (pos === 2 || pos === 3) {
code = code << 8
} else if (pos === 4 || pos === 5) {
code = code << 16
} else if (pos === 6 || pos === 7) {
code = code << 24
}
if (pos % 2 === 0) {
Temp2.low ^= code
} else {
Temp2.high ^= code
}
if (pos === 7) {
xor(target, murmurhash3Long(Temp2, Temp2), target)
return true
} else {
return false
}
}
function murmurhash3String (string, target) {
target.low = 0
target.high = 0
var clean = true
for (var i = 0, offset = 0; i < string.length; i++, offset++) {
var code = string.charCodeAt(i)
if (code >= 256) {
// Unicode
addChar(code & 0xff, target, offset)
clean = addChar((code & 0xff00) >> 8, target, ++offset)
} else {
clean = addChar(code, target, offset)
}
}
if (!clean) {
murmurhash3Long(Temp2, Temp2)
xor(target, Temp2, target)
}
return target
}
function murmurhash3Long (h, target) {
if (h !== target) {
copy(h, target)
}
shiftRightUnsigned(target, 33, Temp)
xor(target, Temp, target)
multiply(target, Multiply1, target, true)
shiftRightUnsigned(target, 33, Temp)
xor(target, Temp, target)
multiply(target, Multiply2, target, true)
shiftRightUnsigned(target, 33, Temp)
xor(target, Temp, target)
return target
}
module.exports = {
murmurhash3Long: murmurhash3Long,
murmurhash3String: murmurhash3String
}