72 #if defined (__cplusplus) 90 #if (defined(XXH_INLINE_ALL) || defined(XXH_PRIVATE_API)) \ 91 && !defined(XXH_INLINE_ALL_31684351384) 93 # define XXH_INLINE_ALL_31684351384 95 # undef XXH_STATIC_LINKING_ONLY 96 # define XXH_STATIC_LINKING_ONLY 98 # undef XXH_PUBLIC_API 99 # if defined(__GNUC__) 100 # define XXH_PUBLIC_API static __inline __attribute__((unused)) 101 # elif defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) ) 102 # define XXH_PUBLIC_API static inline 103 # elif defined(_MSC_VER) 104 # define XXH_PUBLIC_API static __inline 107 # define XXH_PUBLIC_API static 111 # ifdef XXH_NAMESPACE 112 # error "XXH_INLINE_ALL with XXH_NAMESPACE is not supported" 117 # define XXH_NAMESPACE XXH_INLINE_ 123 # define XXH_IPREF(Id) XXH_INLINE_ ## Id 124 # define XXH_OK XXH_IPREF(XXH_OK) 125 # define XXH_ERROR XXH_IPREF(XXH_ERROR) 126 # define XXH_errorcode XXH_IPREF(XXH_errorcode) 127 # define XXH32_canonical_t XXH_IPREF(XXH32_canonical_t) 128 # define XXH64_canonical_t XXH_IPREF(XXH64_canonical_t) 129 # define XXH128_canonical_t XXH_IPREF(XXH128_canonical_t) 130 # define XXH32_state_s XXH_IPREF(XXH32_state_s) 131 # define XXH32_state_t XXH_IPREF(XXH32_state_t) 132 # define XXH64_state_s XXH_IPREF(XXH64_state_s) 133 # define XXH64_state_t XXH_IPREF(XXH64_state_t) 134 # define XXH3_state_s XXH_IPREF(XXH3_state_s) 135 # define XXH3_state_t XXH_IPREF(XXH3_state_t) 136 # define XXH128_hash_t XXH_IPREF(XXH128_hash_t) 138 # undef XXHASH_H_5627135585666179 139 # undef XXHASH_H_STATIC_13879238742 147 #ifndef XXHASH_H_5627135585666179 148 #define XXHASH_H_5627135585666179 1 151 #if !defined(XXH_INLINE_ALL) && !defined(XXH_PRIVATE_API) 152 # if defined(WIN32) && defined(_MSC_VER) && (defined(XXH_IMPORT) || defined(XXH_EXPORT)) 154 # define XXH_PUBLIC_API __declspec(dllexport) 156 # define XXH_PUBLIC_API __declspec(dllimport) 159 # define XXH_PUBLIC_API 175 # define XXH_CAT(A,B) A##B 176 # define XXH_NAME2(A,B) XXH_CAT(A,B) 177 # define XXH_versionNumber XXH_NAME2(XXH_NAMESPACE, XXH_versionNumber) 178 # define XXH32 XXH_NAME2(XXH_NAMESPACE, XXH32) 179 # define XXH32_createState XXH_NAME2(XXH_NAMESPACE, XXH32_createState) 180 # define XXH32_freeState XXH_NAME2(XXH_NAMESPACE, XXH32_freeState) 181 # define XXH32_reset XXH_NAME2(XXH_NAMESPACE, XXH32_reset) 182 # define XXH32_update XXH_NAME2(XXH_NAMESPACE, XXH32_update) 183 # define XXH32_digest XXH_NAME2(XXH_NAMESPACE, XXH32_digest) 184 # define XXH32_copyState XXH_NAME2(XXH_NAMESPACE, XXH32_copyState) 185 # define XXH32_canonicalFromHash XXH_NAME2(XXH_NAMESPACE, XXH32_canonicalFromHash) 186 # define XXH32_hashFromCanonical XXH_NAME2(XXH_NAMESPACE, XXH32_hashFromCanonical) 187 # define XXH64 XXH_NAME2(XXH_NAMESPACE, XXH64) 188 # define XXH64_createState XXH_NAME2(XXH_NAMESPACE, XXH64_createState) 189 # define XXH64_freeState XXH_NAME2(XXH_NAMESPACE, XXH64_freeState) 190 # define XXH64_reset XXH_NAME2(XXH_NAMESPACE, XXH64_reset) 191 # define XXH64_update XXH_NAME2(XXH_NAMESPACE, XXH64_update) 192 # define XXH64_digest XXH_NAME2(XXH_NAMESPACE, XXH64_digest) 193 # define XXH64_copyState XXH_NAME2(XXH_NAMESPACE, XXH64_copyState) 194 # define XXH64_canonicalFromHash XXH_NAME2(XXH_NAMESPACE, XXH64_canonicalFromHash) 195 # define XXH64_hashFromCanonical XXH_NAME2(XXH_NAMESPACE, XXH64_hashFromCanonical) 202 #define XXH_VERSION_MAJOR 0 203 #define XXH_VERSION_MINOR 7 204 #define XXH_VERSION_RELEASE 2 205 #define XXH_VERSION_NUMBER (XXH_VERSION_MAJOR *100*100 + XXH_VERSION_MINOR *100 + XXH_VERSION_RELEASE) 219 #if !defined (__VMS) \ 220 && (defined (__cplusplus) \ 221 || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) ) ) 223 typedef uint32_t XXH32_hash_t;
226 # if UINT_MAX == 0xFFFFFFFFUL 227 typedef unsigned int XXH32_hash_t;
229 # if ULONG_MAX == 0xFFFFFFFFUL 230 typedef unsigned long XXH32_hash_t;
232 # error "unsupported platform : need a 32-bit type" 298 #ifndef XXH_NO_LONG_LONG 302 #if !defined (__VMS) \ 303 && (defined (__cplusplus) \ 304 || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) ) ) 341 #if defined(XXH_STATIC_LINKING_ONLY) && !defined(XXHASH_H_STATIC_13879238742) 342 #define XXHASH_H_STATIC_13879238742 354 struct XXH32_state_s {
355 XXH32_hash_t total_len_32;
356 XXH32_hash_t large_len;
361 XXH32_hash_t mem32[4];
362 XXH32_hash_t memsize;
363 XXH32_hash_t reserved;
367 #ifndef XXH_NO_LONG_LONG 369 struct XXH64_state_s {
376 XXH32_hash_t memsize;
377 XXH32_hash_t reserved32;
455 # define XXH3_64bits XXH_NAME2(XXH_NAMESPACE, XXH3_64bits) 456 # define XXH3_64bits_withSecret XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_withSecret) 457 # define XXH3_64bits_withSeed XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_withSeed) 459 # define XXH3_createState XXH_NAME2(XXH_NAMESPACE, XXH3_createState) 460 # define XXH3_freeState XXH_NAME2(XXH_NAMESPACE, XXH3_freeState) 461 # define XXH3_copyState XXH_NAME2(XXH_NAMESPACE, XXH3_copyState) 463 # define XXH3_64bits_reset XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_reset) 464 # define XXH3_64bits_reset_withSeed XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_reset_withSeed) 465 # define XXH3_64bits_reset_withSecret XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_reset_withSecret) 466 # define XXH3_64bits_update XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_update) 467 # define XXH3_64bits_digest XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_digest) 484 #define XXH3_SECRET_SIZE_MIN 136 497 #if defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) 498 # include <stdalign.h> 499 # define XXH_ALIGN(n) alignas(n) 500 #elif defined(__GNUC__) 501 # define XXH_ALIGN(n) __attribute__ ((aligned(n))) 502 #elif defined(_MSC_VER) 503 # define XXH_ALIGN(n) __declspec(align(n)) 505 # define XXH_ALIGN(n) 508 typedef struct XXH3_state_s XXH3_state_t;
510 #define XXH3_SECRET_DEFAULT_SIZE 192 511 #define XXH3_INTERNALBUFFER_SIZE 256 512 struct XXH3_state_s {
514 XXH_ALIGN(64)
unsigned char customSecret[XXH3_SECRET_DEFAULT_SIZE];
515 XXH_ALIGN(64)
unsigned char buffer[XXH3_INTERNALBUFFER_SIZE];
516 XXH32_hash_t bufferedSize;
517 XXH32_hash_t nbStripesPerBlock;
518 XXH32_hash_t nbStripesSoFar;
519 XXH32_hash_t secretLimit;
520 XXH32_hash_t reserved32;
521 XXH32_hash_t reserved32_2;
525 const
unsigned char* secret;
559 # define XXH128 XXH_NAME2(XXH_NAMESPACE, XXH128) 560 # define XXH3_128bits XXH_NAME2(XXH_NAMESPACE, XXH3_128bits) 561 # define XXH3_128bits_withSeed XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_withSeed) 562 # define XXH3_128bits_withSecret XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_withSecret) 564 # define XXH3_128bits_reset XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_reset) 565 # define XXH3_128bits_reset_withSeed XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_reset_withSeed) 566 # define XXH3_128bits_reset_withSecret XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_reset_withSecret) 567 # define XXH3_128bits_update XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_update) 568 # define XXH3_128bits_digest XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_digest) 570 # define XXH128_isEqual XXH_NAME2(XXH_NAMESPACE, XXH128_isEqual) 571 # define XXH128_cmp XXH_NAME2(XXH_NAMESPACE, XXH128_cmp) 572 # define XXH128_canonicalFromHash XXH_NAME2(XXH_NAMESPACE, XXH128_canonicalFromHash) 573 # define XXH128_hashFromCanonical XXH_NAME2(XXH_NAMESPACE, XXH128_hashFromCanonical) 608 typedef struct {
unsigned char digest[16]; } XXH128_canonical_t;
615 #if defined(XXH_INLINE_ALL) || defined(XXH_PRIVATE_API) 616 # define XXH_IMPLEMENTATION 638 #if ( defined(XXH_INLINE_ALL) || defined(XXH_PRIVATE_API) \ 639 || defined(XXH_IMPLEMENTATION) ) && !defined(XXH_IMPLEM_13a8737387) 640 # define XXH_IMPLEM_13a8737387 658 #ifndef XXH_FORCE_MEMORY_ACCESS 659 # if !defined(__clang__) && defined(__GNUC__) && defined(__ARM_FEATURE_UNALIGNED) && defined(__ARM_ARCH) && (__ARM_ARCH == 6) 660 # define XXH_FORCE_MEMORY_ACCESS 2 661 # elif !defined(__clang__) && ((defined(__INTEL_COMPILER) && !defined(_WIN32)) || \ 662 (defined(__GNUC__) && (defined(__ARM_ARCH) && __ARM_ARCH >= 7))) 663 # define XXH_FORCE_MEMORY_ACCESS 1 672 #ifndef XXH_ACCEPT_NULL_INPUT_POINTER 673 # define XXH_ACCEPT_NULL_INPUT_POINTER 0 683 #ifndef XXH_FORCE_ALIGN_CHECK 684 # if defined(__i386) || defined(_M_IX86) || defined(__x86_64__) || defined(_M_X64) 685 # define XXH_FORCE_ALIGN_CHECK 0 687 # define XXH_FORCE_ALIGN_CHECK 1 707 #ifndef XXH_NO_INLINE_HINTS 708 # if defined(__OPTIMIZE_SIZE__) \ 709 || defined(__NO_INLINE__) 710 # define XXH_NO_INLINE_HINTS 1 712 # define XXH_NO_INLINE_HINTS 0 722 # if defined(__OPTIMIZE_SIZE__) 723 # define XXH_REROLL 1 725 # define XXH_REROLL 0 736 static void* XXH_malloc(
size_t s) {
return malloc(s); }
737 static void XXH_free (
void* p) { free(p); }
740 static void* XXH_memcpy(
void* dest,
const void* src,
size_t size) {
return memcpy(dest,src,size); }
749 # pragma warning(disable : 4127) 752 #if XXH_NO_INLINE_HINTS 753 # define XXH_FORCE_INLINE static 754 # define XXH_NO_INLINE static 755 #elif defined(_MSC_VER) 756 # define XXH_FORCE_INLINE static __forceinline 757 # define XXH_NO_INLINE static __declspec(noinline) 759 # if defined (__cplusplus) || defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L 761 # define XXH_FORCE_INLINE static inline __attribute__((always_inline)) 762 # define XXH_NO_INLINE static __attribute__((noinline)) 764 # define XXH_FORCE_INLINE static inline 765 # define XXH_NO_INLINE static 768 # define XXH_FORCE_INLINE static 769 # define XXH_NO_INLINE static 782 # define DEBUGLEVEL 0 787 # define XXH_ASSERT(c) assert(c) 789 # define XXH_ASSERT(c) ((void)0) 793 #define XXH_STATIC_ASSERT(c) { enum { XXH_sa = 1/(int)(!!(c)) }; } 799 #if !defined (__VMS) \ 800 && (defined (__cplusplus) \ 801 || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) ) ) 803 typedef uint8_t xxh_u8;
805 typedef unsigned char xxh_u8;
807 typedef XXH32_hash_t xxh_u32;
812 #if (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==2)) 815 static xxh_u32 XXH_read32(
const void* memPtr) {
return *(
const xxh_u32*) memPtr; }
817 #elif (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==1)) 821 typedef union { xxh_u32 u32; } __attribute__((packed)) unalign;
822 static xxh_u32 XXH_read32(
const void* ptr) {
return ((
const unalign*)ptr)->u32; }
829 static xxh_u32 XXH_read32(
const void* memPtr)
832 memcpy(&val, memPtr,
sizeof(val));
840 typedef enum { XXH_bigEndian=0, XXH_littleEndian=1 } XXH_endianess;
843 #ifndef XXH_CPU_LITTLE_ENDIAN 844 # if defined(_WIN32) \ 845 || defined(__LITTLE_ENDIAN__) \ 846 || (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) 847 # define XXH_CPU_LITTLE_ENDIAN 1 848 # elif defined(__BIG_ENDIAN__) \ 849 || (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) 850 # define XXH_CPU_LITTLE_ENDIAN 0 852 static int XXH_isLittleEndian(
void)
854 const union { xxh_u32 u; xxh_u8 c[4]; } one = { 1 };
857 # define XXH_CPU_LITTLE_ENDIAN XXH_isLittleEndian() 867 #define XXH_GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__) 869 #ifndef __has_builtin 870 # define __has_builtin(x) 0 873 #if !defined(NO_CLANG_BUILTIN) && __has_builtin(__builtin_rotateleft32) && __has_builtin(__builtin_rotateleft64) 874 # define XXH_rotl32 __builtin_rotateleft32 875 # define XXH_rotl64 __builtin_rotateleft64 877 #elif defined(_MSC_VER) 878 # define XXH_rotl32(x,r) _rotl(x,r) 879 # define XXH_rotl64(x,r) _rotl64(x,r) 881 # define XXH_rotl32(x,r) (((x) << (r)) | ((x) >> (32 - (r)))) 882 # define XXH_rotl64(x,r) (((x) << (r)) | ((x) >> (64 - (r)))) 885 #if defined(_MSC_VER) 886 # define XXH_swap32 _byteswap_ulong 887 #elif XXH_GCC_VERSION >= 403 888 # define XXH_swap32 __builtin_bswap32 890 static xxh_u32 XXH_swap32 (xxh_u32 x)
892 return ((x << 24) & 0xff000000 ) |
893 ((x << 8) & 0x00ff0000 ) |
894 ((x >> 8) & 0x0000ff00 ) |
895 ((x >> 24) & 0x000000ff );
903 typedef enum { XXH_aligned, XXH_unaligned } XXH_alignment;
905 XXH_FORCE_INLINE xxh_u32 XXH_readLE32(
const void* ptr)
907 return XXH_CPU_LITTLE_ENDIAN ? XXH_read32(ptr) : XXH_swap32(XXH_read32(ptr));
910 static xxh_u32 XXH_readBE32(
const void* ptr)
912 return XXH_CPU_LITTLE_ENDIAN ? XXH_swap32(XXH_read32(ptr)) : XXH_read32(ptr);
915 XXH_FORCE_INLINE xxh_u32
916 XXH_readLE32_align(
const void* ptr, XXH_alignment align)
918 if (align==XXH_unaligned) {
919 return XXH_readLE32(ptr);
921 return XXH_CPU_LITTLE_ENDIAN ? *(
const xxh_u32*)ptr : XXH_swap32(*(
const xxh_u32*)ptr);
935 static const xxh_u32 PRIME32_1 = 0x9E3779B1U;
936 static const xxh_u32 PRIME32_2 = 0x85EBCA77U;
937 static const xxh_u32 PRIME32_3 = 0xC2B2AE3DU;
938 static const xxh_u32 PRIME32_4 = 0x27D4EB2FU;
939 static const xxh_u32 PRIME32_5 = 0x165667B1U;
941 static xxh_u32 XXH32_round(xxh_u32 acc, xxh_u32 input)
943 acc += input * PRIME32_2;
944 acc = XXH_rotl32(acc, 13);
946 #if defined(__GNUC__) && defined(__SSE4_1__) && !defined(XXH_ENABLE_AUTOVECTORIZE) 988 __asm__(
"" :
"+r" (acc));
994 static xxh_u32 XXH32_avalanche(xxh_u32 h32)
1004 #define XXH_get32bits(p) XXH_readLE32_align(p, align) 1007 XXH32_finalize(xxh_u32 h32,
const xxh_u8* ptr,
size_t len, XXH_alignment align)
1010 h32 += (*ptr++) * PRIME32_5; \ 1011 h32 = XXH_rotl32(h32, 11) * PRIME32_1 ; 1014 h32 += XXH_get32bits(ptr) * PRIME32_3; \ 1016 h32 = XXH_rotl32(h32, 17) * PRIME32_4 ; 1029 return XXH32_avalanche(h32);
1037 return XXH32_avalanche(h32);
1045 return XXH32_avalanche(h32);
1054 return XXH32_avalanche(h32);
1068 case 0:
return XXH32_avalanche(h32);
1075 XXH_FORCE_INLINE xxh_u32
1076 XXH32_endian_align(
const xxh_u8* input,
size_t len, xxh_u32 seed, XXH_alignment align)
1078 const xxh_u8* bEnd = input + len;
1081 #if defined(XXH_ACCEPT_NULL_INPUT_POINTER) && (XXH_ACCEPT_NULL_INPUT_POINTER>=1) 1084 bEnd=input=(
const xxh_u8*)(
size_t)16;
1089 const xxh_u8*
const limit = bEnd - 15;
1090 xxh_u32 v1 = seed + PRIME32_1 + PRIME32_2;
1091 xxh_u32 v2 = seed + PRIME32_2;
1092 xxh_u32 v3 = seed + 0;
1093 xxh_u32 v4 = seed - PRIME32_1;
1096 v1 = XXH32_round(v1, XXH_get32bits(input)); input += 4;
1097 v2 = XXH32_round(v2, XXH_get32bits(input)); input += 4;
1098 v3 = XXH32_round(v3, XXH_get32bits(input)); input += 4;
1099 v4 = XXH32_round(v4, XXH_get32bits(input)); input += 4;
1100 }
while (input < limit);
1102 h32 = XXH_rotl32(v1, 1) + XXH_rotl32(v2, 7)
1103 + XXH_rotl32(v3, 12) + XXH_rotl32(v4, 18);
1105 h32 = seed + PRIME32_5;
1108 h32 += (xxh_u32)len;
1110 return XXH32_finalize(h32, input, len&15, align);
1125 if (XXH_FORCE_ALIGN_CHECK) {
1126 if ((((
size_t)input) & 3) == 0) {
1127 return XXH32_endian_align((
const xxh_u8*)input, len, seed, XXH_aligned);
1130 return XXH32_endian_align((
const xxh_u8*)input, len, seed, XXH_unaligned);
1150 memcpy(dstState, srcState,
sizeof(*dstState));
1156 memset(&state, 0,
sizeof(state));
1157 state.v1 = seed + PRIME32_1 + PRIME32_2;
1158 state.v2 = seed + PRIME32_2;
1159 state.v3 = seed + 0;
1160 state.v4 = seed - PRIME32_1;
1162 memcpy(statePtr, &state,
sizeof(state) -
sizeof(state.reserved));
1171 #if defined(XXH_ACCEPT_NULL_INPUT_POINTER) && (XXH_ACCEPT_NULL_INPUT_POINTER>=1) 1177 {
const xxh_u8* p = (
const xxh_u8*)input;
1178 const xxh_u8*
const bEnd = p + len;
1180 state->total_len_32 += (XXH32_hash_t)len;
1181 state->large_len |= (XXH32_hash_t)((len>=16) | (state->total_len_32>=16));
1183 if (state->memsize + len < 16) {
1184 XXH_memcpy((xxh_u8*)(state->mem32) + state->memsize, input, len);
1185 state->memsize += (XXH32_hash_t)len;
1189 if (state->memsize) {
1190 XXH_memcpy((xxh_u8*)(state->mem32) + state->memsize, input, 16-state->memsize);
1191 {
const xxh_u32* p32 = state->mem32;
1192 state->v1 = XXH32_round(state->v1, XXH_readLE32(p32)); p32++;
1193 state->v2 = XXH32_round(state->v2, XXH_readLE32(p32)); p32++;
1194 state->v3 = XXH32_round(state->v3, XXH_readLE32(p32)); p32++;
1195 state->v4 = XXH32_round(state->v4, XXH_readLE32(p32));
1197 p += 16-state->memsize;
1202 const xxh_u8*
const limit = bEnd - 16;
1203 xxh_u32 v1 = state->v1;
1204 xxh_u32 v2 = state->v2;
1205 xxh_u32 v3 = state->v3;
1206 xxh_u32 v4 = state->v4;
1209 v1 = XXH32_round(v1, XXH_readLE32(p)); p+=4;
1210 v2 = XXH32_round(v2, XXH_readLE32(p)); p+=4;
1211 v3 = XXH32_round(v3, XXH_readLE32(p)); p+=4;
1212 v4 = XXH32_round(v4, XXH_readLE32(p)); p+=4;
1222 XXH_memcpy(state->mem32, p, (
size_t)(bEnd-p));
1223 state->memsize = (unsigned)(bEnd-p);
1235 if (state->large_len) {
1236 h32 = XXH_rotl32(state->v1, 1)
1237 + XXH_rotl32(state->v2, 7)
1238 + XXH_rotl32(state->v3, 12)
1239 + XXH_rotl32(state->v4, 18);
1241 h32 = state->v3 + PRIME32_5;
1244 h32 += state->total_len_32;
1246 return XXH32_finalize(h32, (
const xxh_u8*)state->mem32, state->memsize, XXH_aligned);
1261 if (XXH_CPU_LITTLE_ENDIAN) hash = XXH_swap32(hash);
1262 memcpy(dst, &hash,
sizeof(*dst));
1267 return XXH_readBE32(src);
1271 #ifndef XXH_NO_LONG_LONG 1295 #ifndef XXH_REROLL_XXH64 1296 # if (defined(__ILP32__) || defined(_ILP32)) \ 1297 || !(defined(__x86_64__) || defined(_M_X64) || defined(_M_AMD64) \ 1298 || defined(_M_ARM64) || defined(__aarch64__) || defined(__arm64__) \ 1299 || defined(__PPC64__) || defined(__PPC64LE__) || defined(__ppc64__) || defined(__powerpc64__) \ 1300 || defined(__mips64__) || defined(__mips64)) \ 1301 || (!defined(SIZE_MAX) || SIZE_MAX < ULLONG_MAX) 1302 # define XXH_REROLL_XXH64 1 1304 # define XXH_REROLL_XXH64 0 1308 #if (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==2)) 1311 static xxh_u64 XXH_read64(
const void* memPtr) {
return *(
const xxh_u64*) memPtr; }
1313 #elif (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==1)) 1317 typedef union { xxh_u32 u32; xxh_u64 u64; } __attribute__((packed)) unalign64;
1318 static xxh_u64 XXH_read64(
const void* ptr) {
return ((
const unalign64*)ptr)->u64; }
1326 static xxh_u64 XXH_read64(
const void* memPtr)
1329 memcpy(&val, memPtr,
sizeof(val));
1335 #if defined(_MSC_VER) 1336 # define XXH_swap64 _byteswap_uint64 1337 #elif XXH_GCC_VERSION >= 403 1338 # define XXH_swap64 __builtin_bswap64 1340 static xxh_u64 XXH_swap64 (xxh_u64 x)
1342 return ((x << 56) & 0xff00000000000000ULL) |
1343 ((x << 40) & 0x00ff000000000000ULL) |
1344 ((x << 24) & 0x0000ff0000000000ULL) |
1345 ((x << 8) & 0x000000ff00000000ULL) |
1346 ((x >> 8) & 0x00000000ff000000ULL) |
1347 ((x >> 24) & 0x0000000000ff0000ULL) |
1348 ((x >> 40) & 0x000000000000ff00ULL) |
1349 ((x >> 56) & 0x00000000000000ffULL);
1353 XXH_FORCE_INLINE xxh_u64 XXH_readLE64(
const void* ptr)
1355 return XXH_CPU_LITTLE_ENDIAN ? XXH_read64(ptr) : XXH_swap64(XXH_read64(ptr));
1358 static xxh_u64 XXH_readBE64(
const void* ptr)
1360 return XXH_CPU_LITTLE_ENDIAN ? XXH_swap64(XXH_read64(ptr)) : XXH_read64(ptr);
1363 XXH_FORCE_INLINE xxh_u64
1364 XXH_readLE64_align(
const void* ptr, XXH_alignment align)
1366 if (align==XXH_unaligned)
1367 return XXH_readLE64(ptr);
1369 return XXH_CPU_LITTLE_ENDIAN ? *(
const xxh_u64*)ptr : XXH_swap64(*(
const xxh_u64*)ptr);
1375 static const xxh_u64 PRIME64_1 = 0x9E3779B185EBCA87ULL;
1376 static const xxh_u64 PRIME64_2 = 0xC2B2AE3D27D4EB4FULL;
1377 static const xxh_u64 PRIME64_3 = 0x165667B19E3779F9ULL;
1378 static const xxh_u64 PRIME64_4 = 0x85EBCA77C2B2AE63ULL;
1379 static const xxh_u64 PRIME64_5 = 0x27D4EB2F165667C5ULL;
1381 static xxh_u64 XXH64_round(xxh_u64 acc, xxh_u64 input)
1383 acc += input * PRIME64_2;
1384 acc = XXH_rotl64(acc, 31);
1389 static xxh_u64 XXH64_mergeRound(xxh_u64 acc, xxh_u64 val)
1391 val = XXH64_round(0, val);
1393 acc = acc * PRIME64_1 + PRIME64_4;
1397 static xxh_u64 XXH64_avalanche(xxh_u64 h64)
1408 #define XXH_get64bits(p) XXH_readLE64_align(p, align) 1411 XXH64_finalize(xxh_u64 h64,
const xxh_u8* ptr,
size_t len, XXH_alignment align)
1413 #define PROCESS1_64 \ 1414 h64 ^= (*ptr++) * PRIME64_5; \ 1415 h64 = XXH_rotl64(h64, 11) * PRIME64_1; 1417 #define PROCESS4_64 \ 1418 h64 ^= (xxh_u64)(XXH_get32bits(ptr)) * PRIME64_1; \ 1420 h64 = XXH_rotl64(h64, 23) * PRIME64_2 + PRIME64_3; 1422 #define PROCESS8_64 { \ 1423 xxh_u64 const k1 = XXH64_round(0, XXH_get64bits(ptr)); \ 1426 h64 = XXH_rotl64(h64,27) * PRIME64_1 + PRIME64_4; \ 1430 if (XXH_REROLL || XXH_REROLL_XXH64) {
1444 return XXH64_avalanche(h64);
1447 case 24: PROCESS8_64;
1449 case 16: PROCESS8_64;
1451 case 8: PROCESS8_64;
1452 return XXH64_avalanche(h64);
1454 case 28: PROCESS8_64;
1456 case 20: PROCESS8_64;
1458 case 12: PROCESS8_64;
1460 case 4: PROCESS4_64;
1461 return XXH64_avalanche(h64);
1463 case 25: PROCESS8_64;
1465 case 17: PROCESS8_64;
1467 case 9: PROCESS8_64;
1469 return XXH64_avalanche(h64);
1471 case 29: PROCESS8_64;
1473 case 21: PROCESS8_64;
1475 case 13: PROCESS8_64;
1477 case 5: PROCESS4_64;
1479 return XXH64_avalanche(h64);
1481 case 26: PROCESS8_64;
1483 case 18: PROCESS8_64;
1485 case 10: PROCESS8_64;
1488 return XXH64_avalanche(h64);
1490 case 30: PROCESS8_64;
1492 case 22: PROCESS8_64;
1494 case 14: PROCESS8_64;
1496 case 6: PROCESS4_64;
1499 return XXH64_avalanche(h64);
1501 case 27: PROCESS8_64;
1503 case 19: PROCESS8_64;
1505 case 11: PROCESS8_64;
1509 return XXH64_avalanche(h64);
1511 case 31: PROCESS8_64;
1513 case 23: PROCESS8_64;
1515 case 15: PROCESS8_64;
1517 case 7: PROCESS4_64;
1519 case 3: PROCESS1_64;
1521 case 2: PROCESS1_64;
1523 case 1: PROCESS1_64;
1525 case 0:
return XXH64_avalanche(h64);
1533 XXH_FORCE_INLINE xxh_u64
1534 XXH64_endian_align(
const xxh_u8* input,
size_t len, xxh_u64 seed, XXH_alignment align)
1536 const xxh_u8* bEnd = input + len;
1539 #if defined(XXH_ACCEPT_NULL_INPUT_POINTER) && (XXH_ACCEPT_NULL_INPUT_POINTER>=1) 1542 bEnd=input=(
const xxh_u8*)(
size_t)32;
1547 const xxh_u8*
const limit = bEnd - 32;
1548 xxh_u64 v1 = seed + PRIME64_1 + PRIME64_2;
1549 xxh_u64 v2 = seed + PRIME64_2;
1550 xxh_u64 v3 = seed + 0;
1551 xxh_u64 v4 = seed - PRIME64_1;
1554 v1 = XXH64_round(v1, XXH_get64bits(input)); input+=8;
1555 v2 = XXH64_round(v2, XXH_get64bits(input)); input+=8;
1556 v3 = XXH64_round(v3, XXH_get64bits(input)); input+=8;
1557 v4 = XXH64_round(v4, XXH_get64bits(input)); input+=8;
1558 }
while (input<=limit);
1560 h64 = XXH_rotl64(v1, 1) + XXH_rotl64(v2, 7) + XXH_rotl64(v3, 12) + XXH_rotl64(v4, 18);
1561 h64 = XXH64_mergeRound(h64, v1);
1562 h64 = XXH64_mergeRound(h64, v2);
1563 h64 = XXH64_mergeRound(h64, v3);
1564 h64 = XXH64_mergeRound(h64, v4);
1567 h64 = seed + PRIME64_5;
1570 h64 += (xxh_u64) len;
1572 return XXH64_finalize(h64, input, len, align);
1587 if (XXH_FORCE_ALIGN_CHECK) {
1588 if ((((
size_t)input) & 7)==0) {
1589 return XXH64_endian_align((
const xxh_u8*)input, len, seed, XXH_aligned);
1592 return XXH64_endian_align((
const xxh_u8*)input, len, seed, XXH_unaligned);
1611 memcpy(dstState, srcState,
sizeof(*dstState));
1617 memset(&state, 0,
sizeof(state));
1618 state.v1 = seed + PRIME64_1 + PRIME64_2;
1619 state.v2 = seed + PRIME64_2;
1620 state.v3 = seed + 0;
1621 state.v4 = seed - PRIME64_1;
1623 memcpy(statePtr, &state,
sizeof(state) -
sizeof(state.reserved64));
1631 #if defined(XXH_ACCEPT_NULL_INPUT_POINTER) && (XXH_ACCEPT_NULL_INPUT_POINTER>=1) 1637 {
const xxh_u8* p = (
const xxh_u8*)input;
1638 const xxh_u8*
const bEnd = p + len;
1640 state->total_len += len;
1642 if (state->memsize + len < 32) {
1643 XXH_memcpy(((xxh_u8*)state->mem64) + state->memsize, input, len);
1644 state->memsize += (xxh_u32)len;
1648 if (state->memsize) {
1649 XXH_memcpy(((xxh_u8*)state->mem64) + state->memsize, input, 32-state->memsize);
1650 state->v1 = XXH64_round(state->v1, XXH_readLE64(state->mem64+0));
1651 state->v2 = XXH64_round(state->v2, XXH_readLE64(state->mem64+1));
1652 state->v3 = XXH64_round(state->v3, XXH_readLE64(state->mem64+2));
1653 state->v4 = XXH64_round(state->v4, XXH_readLE64(state->mem64+3));
1654 p += 32-state->memsize;
1659 const xxh_u8*
const limit = bEnd - 32;
1660 xxh_u64 v1 = state->v1;
1661 xxh_u64 v2 = state->v2;
1662 xxh_u64 v3 = state->v3;
1663 xxh_u64 v4 = state->v4;
1666 v1 = XXH64_round(v1, XXH_readLE64(p)); p+=8;
1667 v2 = XXH64_round(v2, XXH_readLE64(p)); p+=8;
1668 v3 = XXH64_round(v3, XXH_readLE64(p)); p+=8;
1669 v4 = XXH64_round(v4, XXH_readLE64(p)); p+=8;
1679 XXH_memcpy(state->mem64, p, (
size_t)(bEnd-p));
1680 state->memsize = (unsigned)(bEnd-p);
1692 if (state->total_len >= 32) {
1693 xxh_u64
const v1 = state->v1;
1694 xxh_u64
const v2 = state->v2;
1695 xxh_u64
const v3 = state->v3;
1696 xxh_u64
const v4 = state->v4;
1698 h64 = XXH_rotl64(v1, 1) + XXH_rotl64(v2, 7) + XXH_rotl64(v3, 12) + XXH_rotl64(v4, 18);
1699 h64 = XXH64_mergeRound(h64, v1);
1700 h64 = XXH64_mergeRound(h64, v2);
1701 h64 = XXH64_mergeRound(h64, v3);
1702 h64 = XXH64_mergeRound(h64, v4);
1704 h64 = state->v3 + PRIME64_5;
1707 h64 += (xxh_u64) state->total_len;
1709 return XXH64_finalize(h64, (
const xxh_u8*)state->mem64, (size_t)state->total_len, XXH_aligned);
1718 if (XXH_CPU_LITTLE_ENDIAN) hash = XXH_swap64(hash);
1719 memcpy(dst, &hash,
sizeof(*dst));
1724 return XXH_readBE64(src);
1743 #if defined (__cplusplus) XXH_PUBLIC_API void XXH32_copyState(XXH32_state_t *dst_state, const XXH32_state_t *src_state)
XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_digest(const XXH3_state_t *state)
XXH_PUBLIC_API XXH_errorcode XXH3_128bits_reset(XXH3_state_t *statePtr)
struct XXH64_state_s XXH64_state_t
XXH_PUBLIC_API void XXH64_canonicalFromHash(XXH64_canonical_t *dst, XXH64_hash_t hash)
XXH_PUBLIC_API XXH_errorcode XXH3_64bits_reset(XXH3_state_t *statePtr)
static void h2(float r, float r2, float ri, float rc, float r0, float rs, float &h)
XXH_PUBLIC_API XXH128_hash_t XXH3_128bits(const void *input, size_t len)
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)
XXH_PUBLIC_API unsigned XXH_versionNumber(void)
#define XXH_VERSION_NUMBER
XXH_PUBLIC_API XXH_errorcode XXH3_64bits_reset_withSeed(XXH3_state_t *statePtr, XXH64_hash_t seed)
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)
XXH_PUBLIC_API XXH128_hash_t XXH3_128bits_withSeed(const void *input, size_t len, XXH64_hash_t seed)
static void h1(float r, float r2, float ri, float rc, float r0, float rs, float &h)
XXH_PUBLIC_API XXH_errorcode XXH3_64bits_reset_withSecret(XXH3_state_t *statePtr, const void *secret, size_t secretSize)
XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_withSecret(const void *input, size_t len, const void *secret, size_t secretSize)
unsigned long long XXH64_hash_t
XXH_PUBLIC_API XXH64_hash_t XXH64(const void *input, size_t length, XXH64_hash_t seed)
XXH_ALIGN(64) static const xxh_u8 kSecret[XXH_SECRET_DEFAULT_SIZE]
XXH_PUBLIC_API XXH_errorcode XXH64_reset(XXH64_state_t *statePtr, XXH64_hash_t seed)
XXH_PUBLIC_API XXH_errorcode XXH3_64bits_update(XXH3_state_t *state, const void *input, size_t len)
XXH_PUBLIC_API XXH32_hash_t XXH32_digest(const XXH32_state_t *statePtr)
XXH_PUBLIC_API XXH_errorcode XXH3_freeState(XXH3_state_t *statePtr)
XXH_PUBLIC_API int XXH128_cmp(const void *h128_1, const void *h128_2)
XXH_PUBLIC_API XXH128_hash_t XXH3_128bits_digest(const XXH3_state_t *state)
XXH_PUBLIC_API XXH128_hash_t XXH128_hashFromCanonical(const XXH128_canonical_t *src)
XXH_PUBLIC_API XXH_errorcode XXH3_128bits_update(XXH3_state_t *state, const void *input, size_t len)
XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_withSeed(const void *input, size_t len, XXH64_hash_t seed)
XXH_PUBLIC_API XXH32_hash_t XXH32(const void *input, size_t length, XXH32_hash_t seed)
XXH_PUBLIC_API XXH_errorcode XXH3_128bits_reset_withSeed(XXH3_state_t *statePtr, XXH64_hash_t seed)
XXH_PUBLIC_API void XXH64_copyState(XXH64_state_t *dst_state, const XXH64_state_t *src_state)
XXH_PUBLIC_API XXH3_state_t * XXH3_createState(void)
XXH_PUBLIC_API XXH64_state_t * XXH64_createState(void)
XXH_PUBLIC_API XXH64_hash_t XXH3_64bits(const void *input, size_t len)
XXH_PUBLIC_API int XXH128_isEqual(XXH128_hash_t h1, XXH128_hash_t h2)
XXH_PUBLIC_API XXH_errorcode XXH32_freeState(XXH32_state_t *statePtr)
XXH_PUBLIC_API XXH_errorcode XXH32_reset(XXH32_state_t *statePtr, XXH32_hash_t seed)
XXH_PUBLIC_API XXH_errorcode XXH64_freeState(XXH64_state_t *statePtr)
XXH_PUBLIC_API XXH128_hash_t XXH3_128bits_withSecret(const void *input, size_t len, const void *secret, size_t secretSize)
XXH_PUBLIC_API XXH128_hash_t XXH128(const void *input, size_t len, XXH64_hash_t seed)
XXH_PUBLIC_API XXH_errorcode XXH32_update(XXH32_state_t *statePtr, const void *input, size_t length)
struct XXH32_state_s XXH32_state_t
XXH_PUBLIC_API XXH64_hash_t XXH64_hashFromCanonical(const XXH64_canonical_t *src)
XXH_PUBLIC_API void XXH3_copyState(XXH3_state_t *dst_state, const XXH3_state_t *src_state)
XXH_PUBLIC_API XXH32_state_t * XXH32_createState(void)
XXH_PUBLIC_API XXH_errorcode XXH3_128bits_reset_withSecret(XXH3_state_t *statePtr, const void *secret, size_t secretSize)
XXH_PUBLIC_API void XXH128_canonicalFromHash(XXH128_canonical_t *dst, XXH128_hash_t hash)