-
Notifications
You must be signed in to change notification settings - Fork 333
Expand file tree
/
Copy pathFNV64Hash.java
More file actions
69 lines (54 loc) · 1.96 KB
/
FNV64Hash.java
File metadata and controls
69 lines (54 loc) · 1.96 KB
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
package datadog.trace.util;
import java.nio.charset.StandardCharsets;
/**
* Calculates the FNV 64 bit hash. Longs should be treated as though they were unsigned
*
* <p>http://www.isthe.com/chongo/tech/comp/fnv/index.html#FNV-1
*/
public class FNV64Hash {
private static final long FNV_INIT = 0xcbf29ce484222325L;
private static final long FNV_PRIME = 0x100000001b3L;
public enum Version {
v1,
v1A
}
public static long generateHash(String data, Version version) {
return generateHash(data.getBytes(StandardCharsets.UTF_8), version);
}
public static long continueHash(long currentHash, String data, Version version) {
return continueHash(currentHash, data.getBytes(StandardCharsets.UTF_8), version);
}
public static long generateHash(byte[] data, Version version) {
return generateHash(data, 0, data.length, version);
}
public static long continueHash(long currentHash, byte[] data, Version version) {
return continueHash(currentHash, data, 0, data.length, version);
}
public static long generateHash(byte[] data, int start, int length, Version version) {
return continueHash(FNV_INIT, data, start, length, version);
}
public static long continueHash(
long currentHash, byte[] data, int start, int length, Version version) {
if (version == Version.v1) {
return generateFNV1Hash(currentHash, data, start, length);
} else {
return generateFNV1AHash(currentHash, data, start, length);
}
}
private static long generateFNV1Hash(long currentHash, byte[] data, int start, int length) {
long hash = currentHash;
for (int i = start; i < start + length; i++) {
hash *= FNV_PRIME;
hash ^= 0xffL & data[i];
}
return hash;
}
private static long generateFNV1AHash(long currentHash, byte[] data, int start, int length) {
long hash = currentHash;
for (int i = start; i < start + length; i++) {
hash ^= 0xffL & data[i];
hash *= FNV_PRIME;
}
return hash;
}
}