-
Notifications
You must be signed in to change notification settings - Fork 43
Expand file tree
/
Copy pathXXHash.java
More file actions
218 lines (189 loc) · 6.05 KB
/
XXHash.java
File metadata and controls
218 lines (189 loc) · 6.05 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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
package software.amazon.awssdk.crt.checksums;
import software.amazon.awssdk.crt.CrtResource;
public class XXHash extends CrtResource {
private XXHash(long nativeHandle) {
acquireNativeHandle(nativeHandle);
}
/**
* Determines whether a resource releases its dependencies at the same time the native handle is released or if it waits.
* Resources that wait are responsible for calling releaseReferences() manually.
*/
@Override
protected boolean canReleaseReferencesImmediately() { return true; }
/**
* Releases the instance's reference to the underlying native key pair
*/
@Override
protected void releaseNativeHandle() {
if (!isNull()) {
xxHashRelease(getNativeHandle());
}
}
/**
* Create new streaming XXHash64.
* @param seed seed to use for the hash
* @return new XXHash instance
*/
static public XXHash newXXHash64(long seed) {
long nativeHandle = xxHash64Create(seed);
return new XXHash(nativeHandle);
}
/**
* Create new streaming XXHash64.
* @return new XXHash instance
*/
static public XXHash newXXHash64() {
long nativeHandle = xxHash64Create(0);
return new XXHash(nativeHandle);
}
/**
* Create new streaming XXHash3_64.
* @param seed seed to use for the hash
* @return new XXHash instance
*/
static public XXHash newXXHash3_64(long seed) {
long nativeHandle = xxHash364Create(seed);
return new XXHash(nativeHandle);
}
/**
* Create new streaming XXHash3_64.
* @return new XXHash instance
*/
static public XXHash newXXHash3_64() {
long nativeHandle = xxHash364Create(0);
if (nativeHandle != 0) {
return new XXHash(nativeHandle);
}
return null;
}
/**
* Create new streaming XXHash3_128.
* @param seed seed to use for the hash
* @return new XXHash instance
*/
static public XXHash newXXHash3_128(long seed) {
long nativeHandle = xxHash3128Create(seed);
if (nativeHandle != 0) {
return new XXHash(nativeHandle);
}
return null;
}
/**
* Create new streaming XXHash3_128.
* @return new XXHash instance
*/
static public XXHash newXXHash3_128() {
long nativeHandle = xxHash3128Create(0);
if (nativeHandle != 0) {
return new XXHash(nativeHandle);
}
return null;
}
/**
* Update xxhash state from input
* @param input input to update with
*/
public void update(byte[] input) {
this.update(input, 0, input.length);
}
/**
* Update xxhash state with a single byte
* @param b input to update with
*/
public void update(int b) {
if (b < 0 || b > 0xff) {
throw new IllegalArgumentException();
}
byte[] buf = { (byte) (b & 0x000000ff) };
this.update(buf);
}
/**
* Update xxhash state with a subrange of input.
* @param input input to update with
* @param offset to start update with
* @param length of data
*/
public void update(byte[] input, int offset, int length) {
if (input == null) {
throw new NullPointerException();
}
if (offset < 0 || length < 0 || offset > input.length - length) {
throw new ArrayIndexOutOfBoundsException();
}
xxHashUpdate(getNativeHandle(), input, offset, length);
}
/**
* Return digest for the current state of hash.
* @return hash as bytes in big endian
*/
public byte[] digest() {
return xxHashFinalize(getNativeHandle());
}
/**
* Oneshot compute XXHash64.
* @param input input input to hash
* @param seed seed
* @return xxhash64 hash
*/
static public byte[] computeXXHash64(byte[] input, long seed) {
return xxHash64Compute(input, seed);
}
/**
* Oneshot compute XXHash64.
* @param input input input to hash
* @return xxhash64 hash
*/
static public byte[] computeXXHash64(byte[] input) {
return xxHash64Compute(input, 0);
}
/**
* Oneshot compute XXHash3_64.
* @param input input input to hash
* @param seed seed
* @return xxhash64 hash
*/
static public byte[] computeXXHash3_64(byte[] input, long seed) {
return xxHash364Compute(input, seed);
}
/**
* Oneshot compute XXHash3_64.
* @param input input input to hash
* @return xxhash64 hash
*/
static public byte[] computeXXHash3_64(byte[] input) {
return xxHash364Compute(input, 0);
}
/**
* Oneshot compute XXHash3_128.
* @param input input input to hash
* @param seed seed
* @return xxhash64 hash
*/
static public byte[] computeXXHash3_128(byte[] input, long seed) {
return xxHash3128Compute(input, seed);
}
/**
* Oneshot compute XXHash3_128.
* @param input input input to hash
* @return xxhash64 hash
*/
static public byte[] computeXXHash3_128(byte[] input) {
return xxHash3128Compute(input, 0);
}
/*******************************************************************************
* native methods
******************************************************************************/
private static native byte[] xxHash64Compute(byte[] input, long seed);
private static native byte[] xxHash364Compute(byte[] input, long seed);
private static native byte[] xxHash3128Compute(byte[] input, long seed);
private static native long xxHash64Create(long seed);
private static native long xxHash364Create(long seed);
private static native long xxHash3128Create(long seed);
private static native void xxHashRelease(long xxhash);
private static native void xxHashUpdate(long xxhash, byte[] input, int offset, int length);
private static native byte[] xxHashFinalize(long xxhash);
}