Home | History | Annotate | Download | only in lib
      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 {
    137     U32 v;
    138 } _PACKED U32_S;
    139 typedef struct _U64_S
    140 {
    141     U64 v;
    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 ****************************************/
    213 typedef enum { XXH_bigEndian=0, XXH_littleEndian=1 } XXH_endianess;
    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 *****************************/
    229 typedef enum { XXH_aligned, XXH_unaligned } XXH_alignment;
    230 
    231 FORCE_INLINE U32 XXH_readLE32_align(const void* ptr, XXH_endianess endian, XXH_alignment align)
    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 
    244 FORCE_INLINE U64 XXH_readLE64_align(const void* ptr, XXH_endianess endian, XXH_alignment align)
    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
    347     XXH_endianess endian_detected = (XXH_endianess)XXH_CPU_LITTLE_ENDIAN;
    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
    487     XXH_endianess endian_detected = (XXH_endianess)XXH_CPU_LITTLE_ENDIAN;
    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 {
    513     U64 total_len;
    514     U32 seed;
    515     U32 v1;
    516     U32 v2;
    517     U32 v3;
    518     U32 v4;
    519     U32 mem32[4];   /* defined as U32 for alignment */
    520     U32 memsize;
    521 } XXH_istate32_t;
    522 
    523 typedef struct
    524 {
    525     U64 total_len;
    526     U64 seed;
    527     U64 v1;
    528     U64 v2;
    529     U64 v3;
    530     U64 v4;
    531     U64 mem64[4];   /* defined as U64 for alignment */
    532     U32 memsize;
    533 } XXH_istate64_t;
    534 
    535 
    536 XXH32_state_t* XXH32_createState(void)
    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 }
    541 XXH_errorcode XXH32_freeState(XXH32_state_t* statePtr)
    542 {
    543     XXH_free(statePtr);
    544     return XXH_OK;
    545 }
    546 
    547 XXH64_state_t* XXH64_createState(void)
    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 }
    552 XXH_errorcode XXH64_freeState(XXH64_state_t* statePtr)
    553 {
    554     XXH_free(statePtr);
    555     return XXH_OK;
    556 }
    557 
    558 
    559 /*** Hash feed ***/
    560 
    561 XXH_errorcode XXH32_reset(XXH32_state_t* state_in, U32 seed)
    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 {
    679     XXH_endianess endian_detected = (XXH_endianess)XXH_CPU_LITTLE_ENDIAN;
    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 
    689 FORCE_INLINE U32 XXH32_digest_endian (const XXH32_state_t* state_in, XXH_endianess endian)
    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 {
    733     XXH_endianess endian_detected = (XXH_endianess)XXH_CPU_LITTLE_ENDIAN;
    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 {
    833     XXH_endianess endian_detected = (XXH_endianess)XXH_CPU_LITTLE_ENDIAN;
    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 
    843 FORCE_INLINE U64 XXH64_digest_endian (const XXH64_state_t* state_in, XXH_endianess endian)
    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 {
    927     XXH_endianess endian_detected = (XXH_endianess)XXH_CPU_LITTLE_ENDIAN;
    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 
    936