NVBIO
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
xxhash.c
Go to the documentation of this file.
1 /*
2 xxHash - Fast Hash algorithm
3 Copyright (C) 2012-2015, Yann Collet
4 
5 BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
6 
7 Redistribution and use in source and binary forms, with or without
8 modification, are permitted provided that the following conditions are
9 met:
10 
11 * Redistributions of source code must retain the above copyright
12 notice, this list of conditions and the following disclaimer.
13 * Redistributions in binary form must reproduce the above
14 copyright notice, this list of conditions and the following disclaimer
15 in the documentation and/or other materials provided with the
16 distribution.
17 
18 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 
30 You can contact the author at :
31 - xxHash source repository : http://code.google.com/p/xxhash/
32 - xxHash source mirror : https://github.com/Cyan4973/xxHash
33 - public discussion board : https://groups.google.com/forum/#!forum/lz4c
34 */
35 
36 
37 /**************************************
38 * Tuning parameters
39 ***************************************/
40 /* Unaligned memory access is automatically enabled for "common" CPU, such as x86.
41  * For others CPU, the compiler will be more cautious, and insert extra code to ensure aligned access is respected.
42  * If you know your target CPU supports unaligned memory access, you want to force this option manually to improve performance.
43  * You can also enable this parameter if you know your input data will always be aligned (boundaries of 4, for U32).
44  */
45 #if defined(__ARM_FEATURE_UNALIGNED) || defined(__i386) || defined(_M_IX86) || defined(__x86_64__) || defined(_M_X64)
46 # define XXH_USE_UNALIGNED_ACCESS 1
47 #endif
48 
49 /* XXH_ACCEPT_NULL_INPUT_POINTER :
50  * If the input pointer is a null pointer, xxHash default behavior is to trigger a memory access error, since it is a bad pointer.
51  * When this option is enabled, xxHash output for null input pointers will be the same as a null-length input.
52  * By default, this option is disabled. To enable it, uncomment below define :
53  */
54 /* #define XXH_ACCEPT_NULL_INPUT_POINTER 1 */
55 
56 /* XXH_FORCE_NATIVE_FORMAT :
57  * By default, xxHash library provides endian-independant Hash values, based on little-endian convention.
58  * Results are therefore identical for little-endian and big-endian CPU.
59  * This comes at a performance cost for big-endian CPU, since some swapping is required to emulate little-endian format.
60  * Should endian-independance be of no importance for your application, you may set the #define below to 1.
61  * It will improve speed for Big-endian CPU.
62  * This option has no impact on Little_Endian CPU.
63  */
64 #define XXH_FORCE_NATIVE_FORMAT 0
65 
66 
67 /**************************************
68 * Compiler Specific Options
69 ***************************************/
70 #ifdef _MSC_VER /* Visual Studio */
71 # pragma warning(disable : 4127) /* disable: C4127: conditional expression is constant */
72 # define FORCE_INLINE static __forceinline
73 #else
74 # if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 */
75 # ifdef __GNUC__
76 # define FORCE_INLINE static inline __attribute__((always_inline))
77 # else
78 # define FORCE_INLINE static inline
79 # endif
80 # else
81 # define FORCE_INLINE static
82 # endif /* __STDC_VERSION__ */
83 #endif
84 
85 
86 /**************************************
87 * Includes & Memory related functions
88 ***************************************/
89 #include "xxhash.h"
90 /* Modify the local functions below should you wish to use some other memory routines */
91 /* for malloc(), free() */
92 #include <stdlib.h>
93 static void* XXH_malloc(size_t s) { return malloc(s); }
94 static void XXH_free (void* p) { free(p); }
95 /* for memcpy() */
96 #include <string.h>
97 static void* XXH_memcpy(void* dest, const void* src, size_t size)
98 {
99  return memcpy(dest,src,size);
100 }
101 
102 
103 /**************************************
104 * Basic Types
105 ***************************************/
106 #if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 */
107 # include <stdint.h>
108 typedef uint8_t BYTE;
109 typedef uint16_t U16;
110 typedef uint32_t U32;
111 typedef int32_t S32;
112 typedef uint64_t U64;
113 #else
114 typedef unsigned char BYTE;
115 typedef unsigned short U16;
116 typedef unsigned int U32;
117 typedef signed int S32;
118 typedef unsigned long long U64;
119 #endif
120 
121 #if defined(__GNUC__) && !defined(XXH_USE_UNALIGNED_ACCESS)
122 # define _PACKED __attribute__ ((packed))
123 #else
124 # define _PACKED
125 #endif
126 
127 #if !defined(XXH_USE_UNALIGNED_ACCESS) && !defined(__GNUC__)
128 # ifdef __IBMC__
129 # pragma pack(1)
130 # else
131 # pragma pack(push, 1)
132 # endif
133 #endif
134 
135 typedef struct _U32_S
136 {
138 } _PACKED U32_S;
139 typedef struct _U64_S
140 {
142 } _PACKED U64_S;
143 
144 #if !defined(XXH_USE_UNALIGNED_ACCESS) && !defined(__GNUC__)
145 # pragma pack(pop)
146 #endif
147 
148 #define A32(x) (((U32_S *)(x))->v)
149 #define A64(x) (((U64_S *)(x))->v)
150 
151 
152 /*****************************************
153 * Compiler-specific Functions and Macros
154 ******************************************/
155 #define GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__)
156 
157 /* Note : although _rotl exists for minGW (GCC under windows), performance seems poor */
158 #if defined(_MSC_VER)
159 # define XXH_rotl32(x,r) _rotl(x,r)
160 # define XXH_rotl64(x,r) _rotl64(x,r)
161 #else
162 # define XXH_rotl32(x,r) ((x << r) | (x >> (32 - r)))
163 # define XXH_rotl64(x,r) ((x << r) | (x >> (64 - r)))
164 #endif
165 
166 #if defined(_MSC_VER) /* Visual Studio */
167 # define XXH_swap32 _byteswap_ulong
168 # define XXH_swap64 _byteswap_uint64
169 #elif GCC_VERSION >= 403
170 # define XXH_swap32 __builtin_bswap32
171 # define XXH_swap64 __builtin_bswap64
172 #else
173 static U32 XXH_swap32 (U32 x)
174 {
175  return ((x << 24) & 0xff000000 ) |
176  ((x << 8) & 0x00ff0000 ) |
177  ((x >> 8) & 0x0000ff00 ) |
178  ((x >> 24) & 0x000000ff );
179 }
180 static U64 XXH_swap64 (U64 x)
181 {
182  return ((x << 56) & 0xff00000000000000ULL) |
183  ((x << 40) & 0x00ff000000000000ULL) |
184  ((x << 24) & 0x0000ff0000000000ULL) |
185  ((x << 8) & 0x000000ff00000000ULL) |
186  ((x >> 8) & 0x00000000ff000000ULL) |
187  ((x >> 24) & 0x0000000000ff0000ULL) |
188  ((x >> 40) & 0x000000000000ff00ULL) |
189  ((x >> 56) & 0x00000000000000ffULL);
190 }
191 #endif
192 
193 
194 /**************************************
195 * Constants
196 ***************************************/
197 #define PRIME32_1 2654435761U
198 #define PRIME32_2 2246822519U
199 #define PRIME32_3 3266489917U
200 #define PRIME32_4 668265263U
201 #define PRIME32_5 374761393U
202 
203 #define PRIME64_1 11400714785074694791ULL
204 #define PRIME64_2 14029467366897019727ULL
205 #define PRIME64_3 1609587929392839161ULL
206 #define PRIME64_4 9650029242287828579ULL
207 #define PRIME64_5 2870177450012600261ULL
208 
209 
210 /***************************************
211 * Architecture Macros
212 ****************************************/
214 #ifndef XXH_CPU_LITTLE_ENDIAN /* XXH_CPU_LITTLE_ENDIAN can be defined externally, for example using a compiler switch */
215 static const int one = 1;
216 # define XXH_CPU_LITTLE_ENDIAN (*(char*)(&one))
217 #endif
218 
219 
220 /**************************************
221 * Macros
222 ***************************************/
223 #define XXH_STATIC_ASSERT(c) { enum { XXH_static_assert = 1/(!!(c)) }; } /* use only *after* variable declarations */
224 
225 
226 /****************************
227 * Memory reads
228 *****************************/
230 
232 {
233  if (align==XXH_unaligned)
234  return endian==XXH_littleEndian ? A32(ptr) : XXH_swap32(A32(ptr));
235  else
236  return endian==XXH_littleEndian ? *(U32*)ptr : XXH_swap32(*(U32*)ptr);
237 }
238 
239 FORCE_INLINE U32 XXH_readLE32(const void* ptr, XXH_endianess endian)
240 {
241  return XXH_readLE32_align(ptr, endian, XXH_unaligned);
242 }
243 
245 {
246  if (align==XXH_unaligned)
247  return endian==XXH_littleEndian ? A64(ptr) : XXH_swap64(A64(ptr));
248  else
249  return endian==XXH_littleEndian ? *(U64*)ptr : XXH_swap64(*(U64*)ptr);
250 }
251 
252 FORCE_INLINE U64 XXH_readLE64(const void* ptr, XXH_endianess endian)
253 {
254  return XXH_readLE64_align(ptr, endian, XXH_unaligned);
255 }
256 
257 
258 /****************************
259 * Simple Hash Functions
260 *****************************/
261 FORCE_INLINE U32 XXH32_endian_align(const void* input, size_t len, U32 seed, XXH_endianess endian, XXH_alignment align)
262 {
263  const BYTE* p = (const BYTE*)input;
264  const BYTE* bEnd = p + len;
265  U32 h32;
266 #define XXH_get32bits(p) XXH_readLE32_align(p, endian, align)
267 
268 #ifdef XXH_ACCEPT_NULL_INPUT_POINTER
269  if (p==NULL)
270  {
271  len=0;
272  bEnd=p=(const BYTE*)(size_t)16;
273  }
274 #endif
275 
276  if (len>=16)
277  {
278  const BYTE* const limit = bEnd - 16;
279  U32 v1 = seed + PRIME32_1 + PRIME32_2;
280  U32 v2 = seed + PRIME32_2;
281  U32 v3 = seed + 0;
282  U32 v4 = seed - PRIME32_1;
283 
284  do
285  {
286  v1 += XXH_get32bits(p) * PRIME32_2;
287  v1 = XXH_rotl32(v1, 13);
288  v1 *= PRIME32_1;
289  p+=4;
290  v2 += XXH_get32bits(p) * PRIME32_2;
291  v2 = XXH_rotl32(v2, 13);
292  v2 *= PRIME32_1;
293  p+=4;
294  v3 += XXH_get32bits(p) * PRIME32_2;
295  v3 = XXH_rotl32(v3, 13);
296  v3 *= PRIME32_1;
297  p+=4;
298  v4 += XXH_get32bits(p) * PRIME32_2;
299  v4 = XXH_rotl32(v4, 13);
300  v4 *= PRIME32_1;
301  p+=4;
302  }
303  while (p<=limit);
304 
305  h32 = XXH_rotl32(v1, 1) + XXH_rotl32(v2, 7) + XXH_rotl32(v3, 12) + XXH_rotl32(v4, 18);
306  }
307  else
308  {
309  h32 = seed + PRIME32_5;
310  }
311 
312  h32 += (U32) len;
313 
314  while (p+4<=bEnd)
315  {
316  h32 += XXH_get32bits(p) * PRIME32_3;
317  h32 = XXH_rotl32(h32, 17) * PRIME32_4 ;
318  p+=4;
319  }
320 
321  while (p<bEnd)
322  {
323  h32 += (*p) * PRIME32_5;
324  h32 = XXH_rotl32(h32, 11) * PRIME32_1 ;
325  p++;
326  }
327 
328  h32 ^= h32 >> 15;
329  h32 *= PRIME32_2;
330  h32 ^= h32 >> 13;
331  h32 *= PRIME32_3;
332  h32 ^= h32 >> 16;
333 
334  return h32;
335 }
336 
337 
338 unsigned int XXH32 (const void* input, size_t len, unsigned seed)
339 {
340 #if 0
341  /* Simple version, good for code maintenance, but unfortunately slow for small inputs */
342  XXH32_state_t state;
343  XXH32_reset(&state, seed);
344  XXH32_update(&state, input, len);
345  return XXH32_digest(&state);
346 #else
348 
349 # if !defined(XXH_USE_UNALIGNED_ACCESS)
350  if ((((size_t)input) & 3) == 0) /* Input is aligned, let's leverage the speed advantage */
351  {
352  if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT)
353  return XXH32_endian_align(input, len, seed, XXH_littleEndian, XXH_aligned);
354  else
355  return XXH32_endian_align(input, len, seed, XXH_bigEndian, XXH_aligned);
356  }
357 # endif
358 
359  if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT)
360  return XXH32_endian_align(input, len, seed, XXH_littleEndian, XXH_unaligned);
361  else
362  return XXH32_endian_align(input, len, seed, XXH_bigEndian, XXH_unaligned);
363 #endif
364 }
365 
366 FORCE_INLINE U64 XXH64_endian_align(const void* input, size_t len, U64 seed, XXH_endianess endian, XXH_alignment align)
367 {
368  const BYTE* p = (const BYTE*)input;
369  const BYTE* bEnd = p + len;
370  U64 h64;
371 #define XXH_get64bits(p) XXH_readLE64_align(p, endian, align)
372 
373 #ifdef XXH_ACCEPT_NULL_INPUT_POINTER
374  if (p==NULL)
375  {
376  len=0;
377  bEnd=p=(const BYTE*)(size_t)32;
378  }
379 #endif
380 
381  if (len>=32)
382  {
383  const BYTE* const limit = bEnd - 32;
384  U64 v1 = seed + PRIME64_1 + PRIME64_2;
385  U64 v2 = seed + PRIME64_2;
386  U64 v3 = seed + 0;
387  U64 v4 = seed - PRIME64_1;
388 
389  do
390  {
391  v1 += XXH_get64bits(p) * PRIME64_2;
392  p+=8;
393  v1 = XXH_rotl64(v1, 31);
394  v1 *= PRIME64_1;
395  v2 += XXH_get64bits(p) * PRIME64_2;
396  p+=8;
397  v2 = XXH_rotl64(v2, 31);
398  v2 *= PRIME64_1;
399  v3 += XXH_get64bits(p) * PRIME64_2;
400  p+=8;
401  v3 = XXH_rotl64(v3, 31);
402  v3 *= PRIME64_1;
403  v4 += XXH_get64bits(p) * PRIME64_2;
404  p+=8;
405  v4 = XXH_rotl64(v4, 31);
406  v4 *= PRIME64_1;
407  }
408  while (p<=limit);
409 
410  h64 = XXH_rotl64(v1, 1) + XXH_rotl64(v2, 7) + XXH_rotl64(v3, 12) + XXH_rotl64(v4, 18);
411 
412  v1 *= PRIME64_2;
413  v1 = XXH_rotl64(v1, 31);
414  v1 *= PRIME64_1;
415  h64 ^= v1;
416  h64 = h64 * PRIME64_1 + PRIME64_4;
417 
418  v2 *= PRIME64_2;
419  v2 = XXH_rotl64(v2, 31);
420  v2 *= PRIME64_1;
421  h64 ^= v2;
422  h64 = h64 * PRIME64_1 + PRIME64_4;
423 
424  v3 *= PRIME64_2;
425  v3 = XXH_rotl64(v3, 31);
426  v3 *= PRIME64_1;
427  h64 ^= v3;
428  h64 = h64 * PRIME64_1 + PRIME64_4;
429 
430  v4 *= PRIME64_2;
431  v4 = XXH_rotl64(v4, 31);
432  v4 *= PRIME64_1;
433  h64 ^= v4;
434  h64 = h64 * PRIME64_1 + PRIME64_4;
435  }
436  else
437  {
438  h64 = seed + PRIME64_5;
439  }
440 
441  h64 += (U64) len;
442 
443  while (p+8<=bEnd)
444  {
445  U64 k1 = XXH_get64bits(p);
446  k1 *= PRIME64_2;
447  k1 = XXH_rotl64(k1,31);
448  k1 *= PRIME64_1;
449  h64 ^= k1;
450  h64 = XXH_rotl64(h64,27) * PRIME64_1 + PRIME64_4;
451  p+=8;
452  }
453 
454  if (p+4<=bEnd)
455  {
456  h64 ^= (U64)(XXH_get32bits(p)) * PRIME64_1;
457  h64 = XXH_rotl64(h64, 23) * PRIME64_2 + PRIME64_3;
458  p+=4;
459  }
460 
461  while (p<bEnd)
462  {
463  h64 ^= (*p) * PRIME64_5;
464  h64 = XXH_rotl64(h64, 11) * PRIME64_1;
465  p++;
466  }
467 
468  h64 ^= h64 >> 33;
469  h64 *= PRIME64_2;
470  h64 ^= h64 >> 29;
471  h64 *= PRIME64_3;
472  h64 ^= h64 >> 32;
473 
474  return h64;
475 }
476 
477 
478 unsigned long long XXH64 (const void* input, size_t len, unsigned long long seed)
479 {
480 #if 0
481  /* Simple version, good for code maintenance, but unfortunately slow for small inputs */
482  XXH64_state_t state;
483  XXH64_reset(&state, seed);
484  XXH64_update(&state, input, len);
485  return XXH64_digest(&state);
486 #else
488 
489 # if !defined(XXH_USE_UNALIGNED_ACCESS)
490  if ((((size_t)input) & 7)==0) /* Input is aligned, let's leverage the speed advantage */
491  {
492  if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT)
493  return XXH64_endian_align(input, len, seed, XXH_littleEndian, XXH_aligned);
494  else
495  return XXH64_endian_align(input, len, seed, XXH_bigEndian, XXH_aligned);
496  }
497 # endif
498 
499  if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT)
500  return XXH64_endian_align(input, len, seed, XXH_littleEndian, XXH_unaligned);
501  else
502  return XXH64_endian_align(input, len, seed, XXH_bigEndian, XXH_unaligned);
503 #endif
504 }
505 
506 /****************************************************
507  * Advanced Hash Functions
508 ****************************************************/
509 
510 /*** Allocation ***/
511 typedef struct
512 {
519  U32 mem32[4]; /* defined as U32 for alignment */
522 
523 typedef struct
524 {
531  U64 mem64[4]; /* defined as U64 for alignment */
534 
535 
537 {
538  XXH_STATIC_ASSERT(sizeof(XXH32_state_t) >= sizeof(XXH_istate32_t)); /* A compilation error here means XXH32_state_t is not large enough */
539  return (XXH32_state_t*)XXH_malloc(sizeof(XXH32_state_t));
540 }
542 {
543  XXH_free(statePtr);
544  return XXH_OK;
545 }
546 
548 {
549  XXH_STATIC_ASSERT(sizeof(XXH64_state_t) >= sizeof(XXH_istate64_t)); /* A compilation error here means XXH64_state_t is not large enough */
550  return (XXH64_state_t*)XXH_malloc(sizeof(XXH64_state_t));
551 }
553 {
554  XXH_free(statePtr);
555  return XXH_OK;
556 }
557 
558 
559 /*** Hash feed ***/
560 
562 {
563  XXH_istate32_t* state = (XXH_istate32_t*) state_in;
564  state->seed = seed;
565  state->v1 = seed + PRIME32_1 + PRIME32_2;
566  state->v2 = seed + PRIME32_2;
567  state->v3 = seed + 0;
568  state->v4 = seed - PRIME32_1;
569  state->total_len = 0;
570  state->memsize = 0;
571  return XXH_OK;
572 }
573 
574 XXH_errorcode XXH64_reset(XXH64_state_t* state_in, unsigned long long seed)
575 {
576  XXH_istate64_t* state = (XXH_istate64_t*) state_in;
577  state->seed = seed;
578  state->v1 = seed + PRIME64_1 + PRIME64_2;
579  state->v2 = seed + PRIME64_2;
580  state->v3 = seed + 0;
581  state->v4 = seed - PRIME64_1;
582  state->total_len = 0;
583  state->memsize = 0;
584  return XXH_OK;
585 }
586 
587 
588 FORCE_INLINE XXH_errorcode XXH32_update_endian (XXH32_state_t* state_in, const void* input, size_t len, XXH_endianess endian)
589 {
590  XXH_istate32_t* state = (XXH_istate32_t *) state_in;
591  const BYTE* p = (const BYTE*)input;
592  const BYTE* const bEnd = p + len;
593 
594 #ifdef XXH_ACCEPT_NULL_INPUT_POINTER
595  if (input==NULL) return XXH_ERROR;
596 #endif
597 
598  state->total_len += len;
599 
600  if (state->memsize + len < 16) /* fill in tmp buffer */
601  {
602  XXH_memcpy((BYTE*)(state->mem32) + state->memsize, input, len);
603  state->memsize += (U32)len;
604  return XXH_OK;
605  }
606 
607  if (state->memsize) /* some data left from previous update */
608  {
609  XXH_memcpy((BYTE*)(state->mem32) + state->memsize, input, 16-state->memsize);
610  {
611  const U32* p32 = state->mem32;
612  state->v1 += XXH_readLE32(p32, endian) * PRIME32_2;
613  state->v1 = XXH_rotl32(state->v1, 13);
614  state->v1 *= PRIME32_1;
615  p32++;
616  state->v2 += XXH_readLE32(p32, endian) * PRIME32_2;
617  state->v2 = XXH_rotl32(state->v2, 13);
618  state->v2 *= PRIME32_1;
619  p32++;
620  state->v3 += XXH_readLE32(p32, endian) * PRIME32_2;
621  state->v3 = XXH_rotl32(state->v3, 13);
622  state->v3 *= PRIME32_1;
623  p32++;
624  state->v4 += XXH_readLE32(p32, endian) * PRIME32_2;
625  state->v4 = XXH_rotl32(state->v4, 13);
626  state->v4 *= PRIME32_1;
627  p32++;
628  }
629  p += 16-state->memsize;
630  state->memsize = 0;
631  }
632 
633  if (p <= bEnd-16)
634  {
635  const BYTE* const limit = bEnd - 16;
636  U32 v1 = state->v1;
637  U32 v2 = state->v2;
638  U32 v3 = state->v3;
639  U32 v4 = state->v4;
640 
641  do
642  {
643  v1 += XXH_readLE32(p, endian) * PRIME32_2;
644  v1 = XXH_rotl32(v1, 13);
645  v1 *= PRIME32_1;
646  p+=4;
647  v2 += XXH_readLE32(p, endian) * PRIME32_2;
648  v2 = XXH_rotl32(v2, 13);
649  v2 *= PRIME32_1;
650  p+=4;
651  v3 += XXH_readLE32(p, endian) * PRIME32_2;
652  v3 = XXH_rotl32(v3, 13);
653  v3 *= PRIME32_1;
654  p+=4;
655  v4 += XXH_readLE32(p, endian) * PRIME32_2;
656  v4 = XXH_rotl32(v4, 13);
657  v4 *= PRIME32_1;
658  p+=4;
659  }
660  while (p<=limit);
661 
662  state->v1 = v1;
663  state->v2 = v2;
664  state->v3 = v3;
665  state->v4 = v4;
666  }
667 
668  if (p < bEnd)
669  {
670  XXH_memcpy(state->mem32, p, bEnd-p);
671  state->memsize = (int)(bEnd-p);
672  }
673 
674  return XXH_OK;
675 }
676 
677 XXH_errorcode XXH32_update (XXH32_state_t* state_in, const void* input, size_t len)
678 {
680 
681  if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT)
682  return XXH32_update_endian(state_in, input, len, XXH_littleEndian);
683  else
684  return XXH32_update_endian(state_in, input, len, XXH_bigEndian);
685 }
686 
687 
688 
690 {
691  XXH_istate32_t* state = (XXH_istate32_t*) state_in;
692  const BYTE * p = (const BYTE*)state->mem32;
693  BYTE* bEnd = (BYTE*)(state->mem32) + state->memsize;
694  U32 h32;
695 
696  if (state->total_len >= 16)
697  {
698  h32 = XXH_rotl32(state->v1, 1) + XXH_rotl32(state->v2, 7) + XXH_rotl32(state->v3, 12) + XXH_rotl32(state->v4, 18);
699  }
700  else
701  {
702  h32 = state->seed + PRIME32_5;
703  }
704 
705  h32 += (U32) state->total_len;
706 
707  while (p+4<=bEnd)
708  {
709  h32 += XXH_readLE32(p, endian) * PRIME32_3;
710  h32 = XXH_rotl32(h32, 17) * PRIME32_4;
711  p+=4;
712  }
713 
714  while (p<bEnd)
715  {
716  h32 += (*p) * PRIME32_5;
717  h32 = XXH_rotl32(h32, 11) * PRIME32_1;
718  p++;
719  }
720 
721  h32 ^= h32 >> 15;
722  h32 *= PRIME32_2;
723  h32 ^= h32 >> 13;
724  h32 *= PRIME32_3;
725  h32 ^= h32 >> 16;
726 
727  return h32;
728 }
729 
730 
731 U32 XXH32_digest (const XXH32_state_t* state_in)
732 {
734 
735  if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT)
736  return XXH32_digest_endian(state_in, XXH_littleEndian);
737  else
738  return XXH32_digest_endian(state_in, XXH_bigEndian);
739 }
740 
741 
742 FORCE_INLINE XXH_errorcode XXH64_update_endian (XXH64_state_t* state_in, const void* input, size_t len, XXH_endianess endian)
743 {
744  XXH_istate64_t * state = (XXH_istate64_t *) state_in;
745  const BYTE* p = (const BYTE*)input;
746  const BYTE* const bEnd = p + len;
747 
748 #ifdef XXH_ACCEPT_NULL_INPUT_POINTER
749  if (input==NULL) return XXH_ERROR;
750 #endif
751 
752  state->total_len += len;
753 
754  if (state->memsize + len < 32) /* fill in tmp buffer */
755  {
756  XXH_memcpy(((BYTE*)state->mem64) + state->memsize, input, len);
757  state->memsize += (U32)len;
758  return XXH_OK;
759  }
760 
761  if (state->memsize) /* some data left from previous update */
762  {
763  XXH_memcpy(((BYTE*)state->mem64) + state->memsize, input, 32-state->memsize);
764  {
765  const U64* p64 = state->mem64;
766  state->v1 += XXH_readLE64(p64, endian) * PRIME64_2;
767  state->v1 = XXH_rotl64(state->v1, 31);
768  state->v1 *= PRIME64_1;
769  p64++;
770  state->v2 += XXH_readLE64(p64, endian) * PRIME64_2;
771  state->v2 = XXH_rotl64(state->v2, 31);
772  state->v2 *= PRIME64_1;
773  p64++;
774  state->v3 += XXH_readLE64(p64, endian) * PRIME64_2;
775  state->v3 = XXH_rotl64(state->v3, 31);
776  state->v3 *= PRIME64_1;
777  p64++;
778  state->v4 += XXH_readLE64(p64, endian) * PRIME64_2;
779  state->v4 = XXH_rotl64(state->v4, 31);
780  state->v4 *= PRIME64_1;
781  p64++;
782  }
783  p += 32-state->memsize;
784  state->memsize = 0;
785  }
786 
787  if (p+32 <= bEnd)
788  {
789  const BYTE* const limit = bEnd - 32;
790  U64 v1 = state->v1;
791  U64 v2 = state->v2;
792  U64 v3 = state->v3;
793  U64 v4 = state->v4;
794 
795  do
796  {
797  v1 += XXH_readLE64(p, endian) * PRIME64_2;
798  v1 = XXH_rotl64(v1, 31);
799  v1 *= PRIME64_1;
800  p+=8;
801  v2 += XXH_readLE64(p, endian) * PRIME64_2;
802  v2 = XXH_rotl64(v2, 31);
803  v2 *= PRIME64_1;
804  p+=8;
805  v3 += XXH_readLE64(p, endian) * PRIME64_2;
806  v3 = XXH_rotl64(v3, 31);
807  v3 *= PRIME64_1;
808  p+=8;
809  v4 += XXH_readLE64(p, endian) * PRIME64_2;
810  v4 = XXH_rotl64(v4, 31);
811  v4 *= PRIME64_1;
812  p+=8;
813  }
814  while (p<=limit);
815 
816  state->v1 = v1;
817  state->v2 = v2;
818  state->v3 = v3;
819  state->v4 = v4;
820  }
821 
822  if (p < bEnd)
823  {
824  XXH_memcpy(state->mem64, p, bEnd-p);
825  state->memsize = (int)(bEnd-p);
826  }
827 
828  return XXH_OK;
829 }
830 
831 XXH_errorcode XXH64_update (XXH64_state_t* state_in, const void* input, size_t len)
832 {
834 
835  if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT)
836  return XXH64_update_endian(state_in, input, len, XXH_littleEndian);
837  else
838  return XXH64_update_endian(state_in, input, len, XXH_bigEndian);
839 }
840 
841 
842 
844 {
845  XXH_istate64_t * state = (XXH_istate64_t *) state_in;
846  const BYTE * p = (const BYTE*)state->mem64;
847  BYTE* bEnd = (BYTE*)state->mem64 + state->memsize;
848  U64 h64;
849 
850  if (state->total_len >= 32)
851  {
852  U64 v1 = state->v1;
853  U64 v2 = state->v2;
854  U64 v3 = state->v3;
855  U64 v4 = state->v4;
856 
857  h64 = XXH_rotl64(v1, 1) + XXH_rotl64(v2, 7) + XXH_rotl64(v3, 12) + XXH_rotl64(v4, 18);
858 
859  v1 *= PRIME64_2;
860  v1 = XXH_rotl64(v1, 31);
861  v1 *= PRIME64_1;
862  h64 ^= v1;
863  h64 = h64*PRIME64_1 + PRIME64_4;
864 
865  v2 *= PRIME64_2;
866  v2 = XXH_rotl64(v2, 31);
867  v2 *= PRIME64_1;
868  h64 ^= v2;
869  h64 = h64*PRIME64_1 + PRIME64_4;
870 
871  v3 *= PRIME64_2;
872  v3 = XXH_rotl64(v3, 31);
873  v3 *= PRIME64_1;
874  h64 ^= v3;
875  h64 = h64*PRIME64_1 + PRIME64_4;
876 
877  v4 *= PRIME64_2;
878  v4 = XXH_rotl64(v4, 31);
879  v4 *= PRIME64_1;
880  h64 ^= v4;
881  h64 = h64*PRIME64_1 + PRIME64_4;
882  }
883  else
884  {
885  h64 = state->seed + PRIME64_5;
886  }
887 
888  h64 += (U64) state->total_len;
889 
890  while (p+8<=bEnd)
891  {
892  U64 k1 = XXH_readLE64(p, endian);
893  k1 *= PRIME64_2;
894  k1 = XXH_rotl64(k1,31);
895  k1 *= PRIME64_1;
896  h64 ^= k1;
897  h64 = XXH_rotl64(h64,27) * PRIME64_1 + PRIME64_4;
898  p+=8;
899  }
900 
901  if (p+4<=bEnd)
902  {
903  h64 ^= (U64)(XXH_readLE32(p, endian)) * PRIME64_1;
904  h64 = XXH_rotl64(h64, 23) * PRIME64_2 + PRIME64_3;
905  p+=4;
906  }
907 
908  while (p<bEnd)
909  {
910  h64 ^= (*p) * PRIME64_5;
911  h64 = XXH_rotl64(h64, 11) * PRIME64_1;
912  p++;
913  }
914 
915  h64 ^= h64 >> 33;
916  h64 *= PRIME64_2;
917  h64 ^= h64 >> 29;
918  h64 *= PRIME64_3;
919  h64 ^= h64 >> 32;
920 
921  return h64;
922 }
923 
924 
925 unsigned long long XXH64_digest (const XXH64_state_t* state_in)
926 {
928 
929  if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT)
930  return XXH64_digest_endian(state_in, XXH_littleEndian);
931  else
932  return XXH64_digest_endian(state_in, XXH_bigEndian);
933 }
934 
935