forked from Cyan4973/xxHash
-
Notifications
You must be signed in to change notification settings - Fork 1
/
xxhash.h
510 lines (436 loc) · 22.9 KB
/
xxhash.h
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
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
/*
xxHash - Extremely Fast Hash algorithm
Header File
Copyright (C) 2012-2016, Yann Collet.
BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
You can contact the author at :
- xxHash source repository : https://github.com/Cyan4973/xxHash
*/
/* Notice extracted from xxHash homepage :
xxHash is an extremely fast Hash algorithm, running at RAM speed limits.
It also successfully passes all tests from the SMHasher suite.
Comparison (single thread, Windows Seven 32 bits, using SMHasher on a Core 2 Duo @3GHz)
Name Speed Q.Score Author
xxHash 5.4 GB/s 10
CrapWow 3.2 GB/s 2 Andrew
MumurHash 3a 2.7 GB/s 10 Austin Appleby
SpookyHash 2.0 GB/s 10 Bob Jenkins
SBox 1.4 GB/s 9 Bret Mulvey
Lookup3 1.2 GB/s 9 Bob Jenkins
SuperFastHash 1.2 GB/s 1 Paul Hsieh
CityHash64 1.05 GB/s 10 Pike & Alakuijala
FNV 0.55 GB/s 5 Fowler, Noll, Vo
CRC32 0.43 GB/s 9
MD5-32 0.33 GB/s 10 Ronald L. Rivest
SHA1-32 0.28 GB/s 10
Q.Score is a measure of quality of the hash function.
It depends on successfully passing SMHasher test set.
10 is a perfect score.
A 64-bit version, named XXH64, is available since r35.
It offers much better speed, but for 64-bit applications only.
Name Speed on 64 bits Speed on 32 bits
XXH64 13.8 GB/s 1.9 GB/s
XXH32 6.8 GB/s 6.0 GB/s
*/
#ifndef XXHASH_H_5627135585666179
#define XXHASH_H_5627135585666179 1
#if defined (__cplusplus)
extern "C" {
#endif
/* ****************************
* Definitions
******************************/
#include <stddef.h> /* size_t */
typedef enum { XXH_OK=0, XXH_ERROR } XXH_errorcode;
/* ****************************
* API modifier
******************************/
/** XXH_INLINE_ALL (and XXH_PRIVATE_API)
* This is useful to include xxhash functions in `static` mode
* in order to inline them, and remove their symbol from the public list.
* Inlining can offer dramatic performance improvement on small keys.
* Methodology :
* #define XXH_INLINE_ALL
* #include "xxhash.h"
* `xxhash.c` is automatically included.
* It's not useful to compile and link it as a separate module.
*/
#if defined(XXH_INLINE_ALL) || defined(XXH_PRIVATE_API)
# ifndef XXH_STATIC_LINKING_ONLY
# define XXH_STATIC_LINKING_ONLY
# endif
# if defined(__GNUC__)
# define XXH_PUBLIC_API static __inline __attribute__((unused))
# elif defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */)
# define XXH_PUBLIC_API static inline
# elif defined(_MSC_VER)
# define XXH_PUBLIC_API static __inline
# else
/* this version may generate warnings for unused static functions */
# define XXH_PUBLIC_API static
# endif
#else
# define XXH_PUBLIC_API /* do nothing */
#endif /* XXH_INLINE_ALL || XXH_PRIVATE_API */
/*! XXH_NAMESPACE, aka Namespace Emulation :
*
* If you want to include _and expose_ xxHash functions from within your own library,
* but also want to avoid symbol collisions with other libraries which may also include xxHash,
*
* you can use XXH_NAMESPACE, to automatically prefix any public symbol from xxhash library
* with the value of XXH_NAMESPACE (therefore, avoid NULL and numeric values).
*
* Note that no change is required within the calling program as long as it includes `xxhash.h` :
* regular symbol name will be automatically translated by this header.
*/
#ifdef XXH_NAMESPACE
# define XXH_CAT(A,B) A##B
# define XXH_NAME2(A,B) XXH_CAT(A,B)
# define XXH_versionNumber XXH_NAME2(XXH_NAMESPACE, XXH_versionNumber)
# define XXH32 XXH_NAME2(XXH_NAMESPACE, XXH32)
# define XXH32_createState XXH_NAME2(XXH_NAMESPACE, XXH32_createState)
# define XXH32_freeState XXH_NAME2(XXH_NAMESPACE, XXH32_freeState)
# define XXH32_reset XXH_NAME2(XXH_NAMESPACE, XXH32_reset)
# define XXH32_update XXH_NAME2(XXH_NAMESPACE, XXH32_update)
# define XXH32_digest XXH_NAME2(XXH_NAMESPACE, XXH32_digest)
# define XXH32_copyState XXH_NAME2(XXH_NAMESPACE, XXH32_copyState)
# define XXH32_canonicalFromHash XXH_NAME2(XXH_NAMESPACE, XXH32_canonicalFromHash)
# define XXH32_hashFromCanonical XXH_NAME2(XXH_NAMESPACE, XXH32_hashFromCanonical)
# define XXH32a XXH_NAME2(XXH_NAMESPACE, XXH32a)
# define XXH32a_createState XXH_NAME2(XXH_NAMESPACE, XXH32a_createState)
# define XXH32a_freeState XXH_NAME2(XXH_NAMESPACE, XXH32a_freeState)
# define XXH32a_reset XXH_NAME2(XXH_NAMESPACE, XXH32a_reset)
# define XXH32a_update XXH_NAME2(XXH_NAMESPACE, XXH32a_update)
# define XXH32a_digest XXH_NAME2(XXH_NAMESPACE, XXH32a_digest)
# define XXH32a_copyState XXH_NAME2(XXH_NAMESPACE, XXH32a_copyState)
# define XXH64 XXH_NAME2(XXH_NAMESPACE, XXH64)
# define XXH64_createState XXH_NAME2(XXH_NAMESPACE, XXH64_createState)
# define XXH64_freeState XXH_NAME2(XXH_NAMESPACE, XXH64_freeState)
# define XXH64_reset XXH_NAME2(XXH_NAMESPACE, XXH64_reset)
# define XXH64_update XXH_NAME2(XXH_NAMESPACE, XXH64_update)
# define XXH64_digest XXH_NAME2(XXH_NAMESPACE, XXH64_digest)
# define XXH64_copyState XXH_NAME2(XXH_NAMESPACE, XXH64_copyState)
# define XXH64_canonicalFromHash XXH_NAME2(XXH_NAMESPACE, XXH64_canonicalFromHash)
# define XXH64_hashFromCanonical XXH_NAME2(XXH_NAMESPACE, XXH64_hashFromCanonical)
# define XXH64a XXH_NAME2(XXH_NAMESPACE, XXH64a)
# define XXH64a_createState XXH_NAME2(XXH_NAMESPACE, XXH64a_createState)
# define XXH64a_freeState XXH_NAME2(XXH_NAMESPACE, XXH64a_freeState)
# define XXH64a_reset XXH_NAME2(XXH_NAMESPACE, XXH64a_reset)
# define XXH64a_update XXH_NAME2(XXH_NAMESPACE, XXH64a_update)
# define XXH64a_digest XXH_NAME2(XXH_NAMESPACE, XXH64a_digest)
# define XXH64a_copyState XXH_NAME2(XXH_NAMESPACE, XXH64a_copyState)
# define XXH_auto XXH_NAME2(XXH_NAMESPACE, XXH_auto)
# define XXH32_auto XXH_NAME2(XXH_NAMESPACE, XXH32_auto)
# define XXH64_auto XXH_NAME2(XXH_NAMESPACE, XXH64_auto)
#endif
/* *************************************
* Version
***************************************/
#define XXH_VERSION_MAJOR 0
#define XXH_VERSION_MINOR 6
#define XXH_VERSION_RELEASE 5
#define XXH_VERSION_NUMBER (XXH_VERSION_MAJOR *100*100 + XXH_VERSION_MINOR *100 + XXH_VERSION_RELEASE)
XXH_PUBLIC_API unsigned XXH_versionNumber (void);
/*-**********************************************************************
* 32-bit hash
************************************************************************/
typedef unsigned int XXH32_hash_t;
/*! XXH32() :
Calculate the 32-bit hash of sequence "length" bytes stored at memory address "input".
The memory between input & input+length must be valid (allocated and read-accessible).
"seed" can be used to alter the result predictably.
Speed on Core 2 Duo @ 3 GHz (single thread, SMHasher benchmark) : 5.4 GB/s */
XXH_PUBLIC_API XXH32_hash_t XXH32 (const void* input, size_t length, unsigned int seed);
/*====== Streaming ======*/
typedef struct XXH32_state_s XXH32_state_t; /* incomplete type */
XXH_PUBLIC_API XXH32_state_t* XXH32_createState(void);
XXH_PUBLIC_API XXH_errorcode XXH32_freeState(XXH32_state_t* statePtr);
XXH_PUBLIC_API void XXH32_copyState(XXH32_state_t* dst_state, const XXH32_state_t* src_state);
XXH_PUBLIC_API XXH_errorcode XXH32_reset (XXH32_state_t* statePtr, unsigned int seed);
XXH_PUBLIC_API XXH_errorcode XXH32_update (XXH32_state_t* statePtr, const void* input, size_t length);
XXH_PUBLIC_API XXH32_hash_t XXH32_digest (const XXH32_state_t* statePtr);
/*
* Streaming functions generate the xxHash of an input provided in multiple segments.
* Note that, for small input, they are slower than single-call functions, due to state management.
* For small inputs, prefer `XXH32()` and `XXH64()`, which are better optimized.
*
* XXH state must first be allocated, using XXH*_createState() .
*
* Start a new hash by initializing state with a seed, using XXH*_reset().
*
* Then, feed the hash state by calling XXH*_update() as many times as necessary.
* The function returns an error code, with 0 meaning OK, and any other value meaning there is an error.
*
* Finally, a hash value can be produced anytime, by using XXH*_digest().
* This function returns the nn-bits hash as an int or long long.
*
* It's still possible to continue inserting input into the hash state after a digest,
* and generate some new hashes later on, by calling again XXH*_digest().
*
* When done, free XXH state space if it was allocated dynamically.
*/
/*====== Canonical representation ======*/
typedef struct { unsigned char digest[4]; } XXH32_canonical_t;
XXH_PUBLIC_API void XXH32_canonicalFromHash(XXH32_canonical_t* dst, XXH32_hash_t hash);
XXH_PUBLIC_API XXH32_hash_t XXH32_hashFromCanonical(const XXH32_canonical_t* src);
/* Default result type for XXH functions are primitive unsigned 32 and 64 bits.
* The canonical representation uses human-readable write convention, aka big-endian (large digits first).
* These functions allow transformation of hash result into and from its canonical format.
* This way, hash values can be written into a file / memory, and remain comparable on different systems and programs.
*/
#ifndef XXH_NO_LONG_LONG
/*-**********************************************************************
* 64-bit hash
************************************************************************/
typedef unsigned long long XXH64_hash_t;
/*! XXH64() :
Calculate the 64-bit hash of sequence of length "len" stored at memory address "input".
"seed" can be used to alter the result predictably.
This function runs faster on 64-bit systems, but slower on 32-bit systems (see benchmark).
*/
XXH_PUBLIC_API XXH64_hash_t XXH64 (const void* input, size_t length, unsigned long long seed);
/*====== Streaming ======*/
typedef struct XXH64_state_s XXH64_state_t; /* incomplete type */
XXH_PUBLIC_API XXH64_state_t* XXH64_createState(void);
XXH_PUBLIC_API XXH_errorcode XXH64_freeState(XXH64_state_t* statePtr);
XXH_PUBLIC_API void XXH64_copyState(XXH64_state_t* dst_state, const XXH64_state_t* src_state);
XXH_PUBLIC_API XXH_errorcode XXH64_reset (XXH64_state_t* statePtr, unsigned long long seed);
XXH_PUBLIC_API XXH_errorcode XXH64_update (XXH64_state_t* statePtr, const void* input, size_t length);
XXH_PUBLIC_API XXH64_hash_t XXH64_digest (const XXH64_state_t* statePtr);
/*====== Canonical representation ======*/
typedef struct { unsigned char digest[8]; } XXH64_canonical_t;
XXH_PUBLIC_API void XXH64_canonicalFromHash(XXH64_canonical_t* dst, XXH64_hash_t hash);
XXH_PUBLIC_API XXH64_hash_t XXH64_hashFromCanonical(const XXH64_canonical_t* src);
#endif /* XXH_NO_LONG_LONG */
#ifndef XXH_NO_ALT_HASHES
/*-**********************************************************************
* 32-bit and 64-bit hashes (alternative)
************************************************************************/
/*! XXH32a() :
Calculate the 32-bit hash of sequence "length" bytes stored at memory address "input".
The memory between input & input+length must be valid (allocated and read-accessible).
"seed" can be used to alter the result predictably.
Speed on Core 2 Duo @ 3 GHz (single thread, SMHasher benchmark) : 5.4 GB/s
Unlike XXH32, XXH32a is optimized for SIMD, namely SSE4.1 and NEON. It uses
generic instructions with the GCC/Clang __attribute__((vector_size(16)))
extension. It calculates the hash 32 bytes at a time, without 64-bit math,
using two independent vectors. This causes the checksum to change from XXH32.
Make sure you use -ftree-vectorize and -march=native, -msse4.1, -mavx, or
-mfpu=neon.
If XXH_VECTORIZE is zero or SSE4.1 or NEON are not targeted, it will use plain
integers, which is slower.
On NEON and SSE4.1 with aligned reads, this can be 10-20% faster than XXH32. */
XXH_PUBLIC_API XXH32_hash_t XXH32a (const void* input, size_t length, unsigned int seed);
/*====== Streaming ======*/
typedef struct XXH32a_state_s XXH32a_state_t; /* incomplete type */
XXH_PUBLIC_API XXH32a_state_t* XXH32a_createState(void);
XXH_PUBLIC_API XXH_errorcode XXH32a_freeState(XXH32a_state_t* statePtr);
XXH_PUBLIC_API void XXH32a_copyState(XXH32a_state_t* dst_state, const XXH32a_state_t* src_state);
XXH_PUBLIC_API XXH_errorcode XXH32a_reset (XXH32a_state_t* statePtr, unsigned int seed);
XXH_PUBLIC_API XXH_errorcode XXH32a_update (XXH32a_state_t* statePtr, const void* input, size_t length);
XXH_PUBLIC_API XXH32_hash_t XXH32a_digest (const XXH32a_state_t* statePtr);
#ifndef XXH_NO_LONG_LONG
/*! XXH64a() :
Calculates the 64-bit hash of sequence "length" bytes stored at memory address "input".
The memory between input & input+length must be valid (allocated and read-accessible).
"seed" can be used to alter the result predictably.
This uses the same internal loop as XXH32a, so performance will be similar. This means
that a 64-bit hash can quickly be calculated on a 32-bit system, however, on a 64-bit
system, performance will (usually) be slower than XXH64, but no slower than XXH32a.
The only difference is how the beginning and ends are handled. It is perfectly safe,
but not recommended, to alias XXH32a_state_t and XXH64a_state_t and use the different
streaming functions. Most of them call a common function. */
XXH_PUBLIC_API XXH64_hash_t XXH64a (const void* input, size_t length, unsigned long long seed);
/*====== Streaming ======*/
typedef struct XXH32a_state_s XXH64a_state_t; /* They use the same state type. */
XXH_PUBLIC_API XXH64a_state_t* XXH64a_createState(void);
XXH_PUBLIC_API XXH_errorcode XXH64a_freeState(XXH64a_state_t* statePtr);
XXH_PUBLIC_API void XXH64a_copyState(XXH64a_state_t* dst_state, const XXH64a_state_t* src_state);
XXH_PUBLIC_API XXH_errorcode XXH64a_reset (XXH64a_state_t* statePtr, unsigned long long seed);
XXH_PUBLIC_API XXH_errorcode XXH64a_update (XXH64a_state_t* statePtr, const void* input, size_t length);
XXH_PUBLIC_API XXH64_hash_t XXH64a_digest (const XXH64a_state_t* statePtr);
#endif /* !XXH_NO_LONG_LONG */
#endif /* !XXH_NO_ALT_HASHES */
/*! XXH32_auto() :
Calculates *A* 32-bit hash. This will choose either of the xxHash hashes, attempting to choose
the fastest one based on the architecture and the length. Endianness is ignored.
************************************** WARNING **************************************
* DO NOT RELY ON THE EXACT VALUE OF THIS HASH!!!! *
* ----------------------------------------------- *
* Unlike XXH64 and XXH64a, this does not guarantee a stable, cross-platform result. *
* The only reliable promise for this hash is that it will generate the same value *
* on the same CPU and xxHash version. And since CPUs are sometimes interchangable, *
* do not store this value. This should be used for identity hashes e.g. hashtables. *
*************************************************************************************
For the reference, this uses the following logic:
if length <= 128: XXH32
elif x86_64: XXH64
elif XXH_VECTORIZE: XXH32a
else: XXH32
If a hash is unavailable, it will choose the next best hash.
*/
XXH_PUBLIC_API XXH32_hash_t XXH32_auto (const void* input, size_t length, unsigned seed);
#ifndef XXH_NO_LONG_LONG
/*! XXH_auto() :
Calculates *A* 32 or 64-bit hash, depending on size_t's width. This will choose either of
the xxHash hashes, attempting to choose the fastest one based on the architecture and
the length.
************************************** WARNING **************************************
* DO NOT RELY ON THE EXACT VALUE OF THIS HASH!!!! *
* ----------------------------------------------- *
* Unlike XXH64 and XXH64a, this does not guarantee a stable, cross-platform result. *
* The only reliable promise for this hash is that it will generate the same value *
* on the same CPU and xxHash version. And since CPUs are sometimes interchangable, *
* do not store this value. This should be used for identity hashes e.g. hashtables. *
*************************************************************************************
This will call either XXH32_auto or XXH64_auto depending on the native word size. */
XXH_PUBLIC_API size_t XXH_auto (const void* input, size_t length, size_t seed);
/*! XXH64_auto() :
Calculates *A* 64-bit hash. This will choose either of the xxHash hashes,
attempting to choose the fastest one based on the architecture and the length.
************************************** WARNING **************************************
* DO NOT RELY ON THE EXACT VALUE OF THIS HASH!!!! *
* ----------------------------------------------- *
* Unlike XXH64 and XXH64a, this does not guarantee a stable, cross-platform result. *
* The only reliable promise for this hash is that it will generate the same value *
* on the same CPU and xxHash version. And since CPUs are sometimes interchangable, *
* do not store this value. This should be used for identity hashes e.g. hashtables. *
*************************************************************************************
For the reference, this chooses the following logic:
if length <= 128: XXH64
elif x86_64 && SSE4.2: XXH64
elif 32-bit || NEON: XXH64a
else: XXH64
If a hash is unavailable, it will choose the next best hash.
*/
XXH_PUBLIC_API XXH64_hash_t XXH64_auto (const void* input, size_t length, unsigned long long seed);
#endif /* !XXH_NO_LONG_LONG */
#ifdef XXH_STATIC_LINKING_ONLY
/* We want XXH32a_state_t to be aligned. That way we can reinterpret it as a pointer
* to an SIMD vector. In most cases, we are fine, as we already expect GCC which has
* had __aligned__ since at least 2.95. */
#if defined(__GNUC__)
# define XXH_ALIGN_16 __attribute__((__aligned__(16)))
#elif defined(__cplusplus) && __cplusplus >= 201103L
# define XXH_ALIGN_16 alignas(16)
#elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L
/* Assuming we have a compiler with DR 444:
* "As initially published, C11 does not allow alignas specifiers in structure
* and union members; this was corrected by DR 444." */
# define XXH_ALIGN_16 _Alignas(16)
#else /* Yuck. */
# define XXH_ALIGN_16
#endif
/* ================================================================================================
This section contains declarations which are not guaranteed to remain stable.
They may change in future versions, becoming incompatible with a different version of the library.
These declarations should only be used with static linking.
Never use them in association with dynamic linking !
=================================================================================================== */
/* These definitions are only present to allow
* static allocation of XXH state, on stack or in a struct for example.
* Never **ever** use members directly. */
#if !defined (__VMS) \
&& (defined (__cplusplus) \
|| (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) )
# include <stdint.h>
struct XXH32_state_s {
uint32_t total_len_32;
uint32_t large_len;
uint32_t v1;
uint32_t v2;
uint32_t v3;
uint32_t v4;
uint32_t mem32[4];
uint32_t memsize;
uint32_t reserved; /* never read nor write, might be removed in a future version */
}; /* typedef'd to XXH32_state_t */
/* The order of this struct is important. Changing these can result in excessive padding,
* unaligned reads, or worse. */
struct XXH32a_state_s {
XXH_ALIGN_16 /* Offset */
uint32_t v[2][4]; /* 0 */
XXH_ALIGN_16
uint32_t mem32[8]; /* 32 */
uint32_t total_len_32; /* 64 */
uint32_t large_len; /* 68 */
uint32_t memsize; /* 72 */
uint32_t reserved; /* 76 - never read nor write, might be removed in a future version */
}; /* typedef'd to XXH32a_state_t */
# ifndef XXH_NO_LONG_LONG
struct XXH64_state_s {
uint64_t total_len;
uint64_t v1;
uint64_t v2;
uint64_t v3;
uint64_t v4;
uint64_t mem64[4];
uint32_t memsize;
uint32_t reserved[2]; /* never read nor write, might be removed in a future version */
}; /* typedef'd to XXH64_state_t */
# endif
# else
struct XXH32_state_s {
unsigned total_len_32;
unsigned large_len;
unsigned v1;
unsigned v2;
unsigned v3;
unsigned v4;
unsigned mem32[4];
unsigned memsize;
unsigned reserved; /* never read nor write, might be removed in a future version */
}; /* typedef'd to XXH32_state_t */
/* The order of this struct is important. Changing these can result in excessive padding,
* unaligned reads, or worse. */
struct XXH32a_state_s {
XXH_ALIGN_16 /* Offset */
unsigned v[2][4]; /* 0 */
XXH_ALIGN_16
unsigned mem32[8]; /* 32 */
unsigned total_len_32; /* 64 */
unsigned large_len; /* 68 */
unsigned memsize; /* 72 */
unsigned reserved; /* 76 - never read nor write, might be removed in a future version */
}; /* typedef'd to XXH32a_state_t */
# ifndef XXH_NO_LONG_LONG /* remove 64-bit support */
struct XXH64_state_s {
unsigned long long total_len;
unsigned long long v1;
unsigned long long v2;
unsigned long long v3;
unsigned long long v4;
unsigned long long mem64[4];
unsigned memsize;
unsigned reserved[2]; /* never read nor write, might be removed in a future version */
}; /* typedef'd to XXH64_state_t */
# endif
# endif
#if defined(XXH_INLINE_ALL) || defined(XXH_PRIVATE_API)
# include "xxhash.c" /* include xxhash function bodies as `static`, for inlining */
#endif
#endif /* XXH_STATIC_LINKING_ONLY */
#if defined (__cplusplus)
}
#endif
#endif /* XXHASH_H_5627135585666179 */