165f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe/*
265f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens AxboexxHash - Fast Hash algorithm
365f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens AxboeCopyright (C) 2012-2014, Yann Collet.
465f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens AxboeBSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
565f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
665f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens AxboeRedistribution and use in source and binary forms, with or without
765f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboemodification, are permitted provided that the following conditions are
865f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboemet:
965f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
1065f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe* Redistributions of source code must retain the above copyright
1165f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboenotice, this list of conditions and the following disclaimer.
1265f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe* Redistributions in binary form must reproduce the above
1365f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboecopyright notice, this list of conditions and the following disclaimer
1465f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboein the documentation and/or other materials provided with the
1565f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboedistribution.
1665f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
1765f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens AxboeTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1865f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1965f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens AxboeLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2065f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens AxboeA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2165f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens AxboeOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2265f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens AxboeSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2365f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens AxboeLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2465f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens AxboeDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2565f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens AxboeTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2665f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2765f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens AxboeOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2865f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
2965f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens AxboeYou can contact the author at :
3065f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe- xxHash source repository : http://code.google.com/p/xxhash/
3165f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe*/
3265f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
3365f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
3465f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe//**************************************
3565f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe// Tuning parameters
3665f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe//**************************************
3765f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe// Unaligned memory access is automatically enabled for "common" CPU, such as x86.
3865f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe// For others CPU, the compiler will be more cautious, and insert extra code to ensure aligned access is respected.
3965f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe// If you know your target CPU supports unaligned memory access, you want to force this option manually to improve performance.
4065f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe// You can also enable this parameter if you know your input data will always be aligned (boundaries of 4, for uint32_t).
4165f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe#if defined(__ARM_FEATURE_UNALIGNED) || defined(__i386) || defined(_M_IX86) || defined(__x86_64__) || defined(_M_X64)
4265f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe#  define XXH_USE_UNALIGNED_ACCESS 1
4365f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe#endif
4465f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
4565f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe// XXH_ACCEPT_NULL_INPUT_POINTER :
4665f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe// If the input pointer is a null pointer, xxHash default behavior is to trigger a memory access error, since it is a bad pointer.
4765f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe// When this option is enabled, xxHash output for null input pointers will be the same as a null-length input.
4865f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe// This option has a very small performance cost (only measurable on small inputs).
4965f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe// By default, this option is disabled. To enable it, uncomment below define :
5065f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe//#define XXH_ACCEPT_NULL_INPUT_POINTER 1
5165f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
5265f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe// XXH_FORCE_NATIVE_FORMAT :
5365f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe// By default, xxHash library provides endian-independant Hash values, based on little-endian convention.
5465f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe// Results are therefore identical for little-endian and big-endian CPU.
5565f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe// This comes at a performance cost for big-endian CPU, since some swapping is required to emulate little-endian format.
5665f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe// Should endian-independance be of no importance for your application, you may set the #define below to 1.
5765f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe// It will improve speed for Big-endian CPU.
5865f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe// This option has no impact on Little_Endian CPU.
5965f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe#define XXH_FORCE_NATIVE_FORMAT 0
6065f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
6165f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
6265f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe//**************************************
6365f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe// Includes & Memory related functions
6465f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe//**************************************
6565f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe#include "xxhash.h"
6665f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe#include <stdlib.h>
6765f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe#include <string.h>
6865f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
6965f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
7065f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe#if defined(__GNUC__)  && !defined(XXH_USE_UNALIGNED_ACCESS)
7165f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe#  define _PACKED __attribute__ ((packed))
7265f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe#else
7365f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe#  define _PACKED
7465f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe#endif
7565f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
7665f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe#if !defined(XXH_USE_UNALIGNED_ACCESS) && !defined(__GNUC__)
7765f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe#  ifdef __IBMC__
7865f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe#    pragma pack(1)
7965f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe#  else
8065f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe#    pragma pack(push, 1)
8165f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe#  endif
8265f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe#endif
8365f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
8465f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboetypedef struct _uint32_t_S { uint32_t v; } _PACKED uint32_t_S;
8565f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
8665f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe#if !defined(XXH_USE_UNALIGNED_ACCESS) && !defined(__GNUC__)
8765f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe#  pragma pack(pop)
8865f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe#endif
8965f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
9065f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe#define A32(x) (((uint32_t_S *)(x))->v)
9165f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
9265f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
9365f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe//***************************************
9465f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe// Compiler-specific Functions and Macros
9565f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe//***************************************
9665f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe#define GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__)
9765f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
9865f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe// Note : although _rotl exists for minGW (GCC under windows), performance seems poor
9965f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe#if defined(_MSC_VER)
10065f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe#  define XXH_rotl32(x,r) _rotl(x,r)
10165f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe#else
10265f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe#  define XXH_rotl32(x,r) ((x << r) | (x >> (32 - r)))
10365f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe#endif
10465f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
10565f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe#if defined(_MSC_VER)     // Visual Studio
10665f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe#  define XXH_swap32 _byteswap_ulong
10765f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe#elif GCC_VERSION >= 403
10865f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe#  define XXH_swap32 __builtin_bswap32
10965f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe#else
11065f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboestatic inline uint32_t XXH_swap32 (uint32_t x)
11165f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe{
11265f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    return  ((x << 24) & 0xff000000 ) |
11365f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe        ((x <<  8) & 0x00ff0000 ) |
11465f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe        ((x >>  8) & 0x0000ff00 ) |
11565f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe        ((x >> 24) & 0x000000ff );
11665f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe}
11765f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe#endif
11865f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
11965f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
12065f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe//**************************************
12165f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe// Constants
12265f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe//**************************************
12365f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe#define PRIME32_1   2654435761U
12465f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe#define PRIME32_2   2246822519U
12565f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe#define PRIME32_3   3266489917U
12665f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe#define PRIME32_4    668265263U
12765f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe#define PRIME32_5    374761393U
12865f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
12965f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
13065f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe//**************************************
13165f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe// Architecture Macros
13265f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe//**************************************
13365f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboetypedef enum { XXH_bigEndian=0, XXH_littleEndian=1 } XXH_endianess;
13465f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe#ifndef XXH_CPU_LITTLE_ENDIAN   // It is possible to define XXH_CPU_LITTLE_ENDIAN externally, for example using a compiler switch
13565f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    static const int one = 1;
13665f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe#   define XXH_CPU_LITTLE_ENDIAN   (*(char*)(&one))
13765f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe#endif
13865f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
13965f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
14065f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe//**************************************
14165f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe// Macros
14265f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe//**************************************
14365f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe#define XXH_STATIC_ASSERT(c)   { enum { XXH_static_assert = 1/(!!(c)) }; }    // use only *after* variable declarations
14465f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
14565f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
14665f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe//****************************
14765f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe// Memory reads
14865f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe//****************************
14965f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboetypedef enum { XXH_aligned, XXH_unaligned } XXH_alignment;
15065f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
15110aa136bddbaa7c845ab4eacb4a9a4a88d6657a3Jens Axboestatic uint32_t XXH_readLE32_align(const uint32_t* ptr, XXH_endianess endian, XXH_alignment align)
152190b8f0c9c1c1a99ed26fd953f7af9023f9533eeCastor Fu{
15365f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    if (align==XXH_unaligned)
154190b8f0c9c1c1a99ed26fd953f7af9023f9533eeCastor Fu        return endian==XXH_littleEndian ? A32(ptr) : XXH_swap32(A32(ptr));
15565f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    else
156190b8f0c9c1c1a99ed26fd953f7af9023f9533eeCastor Fu        return endian==XXH_littleEndian ? *ptr : XXH_swap32(*ptr);
15765f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe}
15865f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
15910aa136bddbaa7c845ab4eacb4a9a4a88d6657a3Jens Axboestatic uint32_t XXH_readLE32(const uint32_t* ptr, XXH_endianess endian) { return XXH_readLE32_align(ptr, endian, XXH_unaligned); }
16065f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
16165f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
16265f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe//****************************
16365f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe// Simple Hash Functions
16465f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe//****************************
16510aa136bddbaa7c845ab4eacb4a9a4a88d6657a3Jens Axboestatic uint32_t XXH32_endian_align(const void* input, int len, uint32_t seed, XXH_endianess endian, XXH_alignment align)
16665f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe{
16765f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    const uint8_t *p = (const uint8_t *)input;
16865f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    const uint8_t * const bEnd = p + len;
16965f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    uint32_t h32;
17065f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
17165f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe#ifdef XXH_ACCEPT_NULL_INPUT_POINTER
17265f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    if (p==NULL) { len=0; p=(const uint8_t *)(size_t)16; }
17365f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe#endif
17465f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
17565f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    if (len>=16)
17665f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    {
17765f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe        const uint8_t * const limit = bEnd - 16;
17865f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe        uint32_t v1 = seed + PRIME32_1 + PRIME32_2;
17965f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe        uint32_t v2 = seed + PRIME32_2;
18065f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe        uint32_t v3 = seed + 0;
18165f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe        uint32_t v4 = seed - PRIME32_1;
18265f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
18365f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe        do
18465f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe        {
18565f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe            v1 += XXH_readLE32_align((const uint32_t*)p, endian, align) * PRIME32_2; v1 = XXH_rotl32(v1, 13); v1 *= PRIME32_1; p+=4;
18665f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe            v2 += XXH_readLE32_align((const uint32_t*)p, endian, align) * PRIME32_2; v2 = XXH_rotl32(v2, 13); v2 *= PRIME32_1; p+=4;
18765f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe            v3 += XXH_readLE32_align((const uint32_t*)p, endian, align) * PRIME32_2; v3 = XXH_rotl32(v3, 13); v3 *= PRIME32_1; p+=4;
18865f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe            v4 += XXH_readLE32_align((const uint32_t*)p, endian, align) * PRIME32_2; v4 = XXH_rotl32(v4, 13); v4 *= PRIME32_1; p+=4;
18965f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe        } while (p<=limit);
19065f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
19165f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe        h32 = XXH_rotl32(v1, 1) + XXH_rotl32(v2, 7) + XXH_rotl32(v3, 12) + XXH_rotl32(v4, 18);
19265f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    }
19365f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    else
19465f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    {
19565f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe        h32  = seed + PRIME32_5;
19665f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    }
19765f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
19865f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    h32 += (uint32_t) len;
19965f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
20065f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    while (p<=bEnd-4)
20165f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    {
20265f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe        h32 += XXH_readLE32_align((const uint32_t*)p, endian, align) * PRIME32_3;
20365f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe        h32  = XXH_rotl32(h32, 17) * PRIME32_4 ;
20465f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe        p+=4;
20565f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    }
20665f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
20765f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    while (p<bEnd)
20865f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    {
20965f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe        h32 += (*p) * PRIME32_5;
21065f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe        h32 = XXH_rotl32(h32, 11) * PRIME32_1 ;
21165f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe        p++;
21265f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    }
21365f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
21465f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    h32 ^= h32 >> 15;
21565f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    h32 *= PRIME32_2;
21665f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    h32 ^= h32 >> 13;
21765f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    h32 *= PRIME32_3;
21865f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    h32 ^= h32 >> 16;
21965f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
22065f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    return h32;
22165f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe}
22265f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
22365f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
22465f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboeuint32_t XXH32(const void* input, int len, uint32_t seed)
22565f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe{
22665f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe#if 0
22765f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    // Simple version, good for code maintenance, but unfortunately slow for small inputs
22865f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    void* state = XXH32_init(seed);
22965f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    XXH32_update(state, input, len);
23065f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    return XXH32_digest(state);
23165f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe#else
23265f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    XXH_endianess endian_detected = (XXH_endianess)XXH_CPU_LITTLE_ENDIAN;
23365f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
23465f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe#  if !defined(XXH_USE_UNALIGNED_ACCESS)
23565f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    if ((((size_t)input) & 3))   // Input is aligned, let's leverage the speed advantage
23665f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    {
23765f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe        if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT)
23865f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe            return XXH32_endian_align(input, len, seed, XXH_littleEndian, XXH_aligned);
23965f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe        else
24065f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe            return XXH32_endian_align(input, len, seed, XXH_bigEndian, XXH_aligned);
24165f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    }
24265f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe#  endif
24365f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
24465f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT)
24565f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe        return XXH32_endian_align(input, len, seed, XXH_littleEndian, XXH_unaligned);
24665f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    else
24765f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe        return XXH32_endian_align(input, len, seed, XXH_bigEndian, XXH_unaligned);
24865f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe#endif
24965f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe}
25065f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
25165f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
25265f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe//****************************
25365f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe// Advanced Hash Functions
25465f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe//****************************
25565f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
256190b8f0c9c1c1a99ed26fd953f7af9023f9533eeCastor Fuint XXH32_sizeofState(void)
25765f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe{
25865f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    XXH_STATIC_ASSERT(XXH32_SIZEOFSTATE >= sizeof(struct XXH_state32_t));   // A compilation error here means XXH32_SIZEOFSTATE is not large enough
259190b8f0c9c1c1a99ed26fd953f7af9023f9533eeCastor Fu    return sizeof(struct XXH_state32_t);
26065f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe}
26165f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
26265f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
26365f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens AxboeXXH_errorcode XXH32_resetState(void* state_in, uint32_t seed)
264190b8f0c9c1c1a99ed26fd953f7af9023f9533eeCastor Fu{
26565f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    struct XXH_state32_t * state = (struct XXH_state32_t *) state_in;
26665f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    state->seed = seed;
26765f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    state->v1 = seed + PRIME32_1 + PRIME32_2;
26865f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    state->v2 = seed + PRIME32_2;
26965f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    state->v3 = seed + 0;
27065f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    state->v4 = seed - PRIME32_1;
27165f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    state->total_len = 0;
27265f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    state->memsize = 0;
27365f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    return XXH_OK;
27465f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe}
27565f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
27665f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
27765f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboevoid* XXH32_init (uint32_t seed)
27865f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe{
27965f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    void *state = malloc (sizeof(struct XXH_state32_t));
28065f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    XXH32_resetState(state, seed);
28165f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    return state;
28265f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe}
28365f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
28465f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
28510aa136bddbaa7c845ab4eacb4a9a4a88d6657a3Jens Axboestatic XXH_errorcode XXH32_update_endian (void* state_in, const void* input, int len, XXH_endianess endian)
28665f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe{
28765f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    struct XXH_state32_t * state = (struct XXH_state32_t *) state_in;
28865f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    const uint8_t *p = (const uint8_t *)input;
28965f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    const uint8_t * const bEnd = p + len;
29065f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
29165f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe#ifdef XXH_ACCEPT_NULL_INPUT_POINTER
29265f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    if (input==NULL) return XXH_ERROR;
29365f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe#endif
29465f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
29565f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    state->total_len += len;
29665f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
29765f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    if (state->memsize + len < 16)   // fill in tmp buffer
29865f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    {
29965f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe        memcpy(state->memory + state->memsize, input, len);
30065f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe        state->memsize +=  len;
30165f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe        return XXH_OK;
30265f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    }
30365f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
30465f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    if (state->memsize)   // some data left from previous update
30565f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    {
30665f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe        memcpy(state->memory + state->memsize, input, 16-state->memsize);
30765f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe        {
30865f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe            const uint32_t* p32 = (const uint32_t*)state->memory;
30965f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe            state->v1 += XXH_readLE32(p32, endian) * PRIME32_2; state->v1 = XXH_rotl32(state->v1, 13); state->v1 *= PRIME32_1; p32++;
310190b8f0c9c1c1a99ed26fd953f7af9023f9533eeCastor Fu            state->v2 += XXH_readLE32(p32, endian) * PRIME32_2; state->v2 = XXH_rotl32(state->v2, 13); state->v2 *= PRIME32_1; p32++;
31165f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe            state->v3 += XXH_readLE32(p32, endian) * PRIME32_2; state->v3 = XXH_rotl32(state->v3, 13); state->v3 *= PRIME32_1; p32++;
31265f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe            state->v4 += XXH_readLE32(p32, endian) * PRIME32_2; state->v4 = XXH_rotl32(state->v4, 13); state->v4 *= PRIME32_1; p32++;
31365f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe        }
31465f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe        p += 16-state->memsize;
31565f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe        state->memsize = 0;
31665f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    }
31765f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
31865f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    if (p <= bEnd-16)
31965f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    {
32065f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe        const uint8_t * const limit = bEnd - 16;
32165f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe        uint32_t v1 = state->v1;
32265f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe        uint32_t v2 = state->v2;
32365f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe        uint32_t v3 = state->v3;
32465f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe        uint32_t v4 = state->v4;
32565f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
32665f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe        do
32765f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe        {
32865f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe            v1 += XXH_readLE32((const uint32_t*)p, endian) * PRIME32_2; v1 = XXH_rotl32(v1, 13); v1 *= PRIME32_1; p+=4;
32965f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe            v2 += XXH_readLE32((const uint32_t*)p, endian) * PRIME32_2; v2 = XXH_rotl32(v2, 13); v2 *= PRIME32_1; p+=4;
33065f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe            v3 += XXH_readLE32((const uint32_t*)p, endian) * PRIME32_2; v3 = XXH_rotl32(v3, 13); v3 *= PRIME32_1; p+=4;
33165f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe            v4 += XXH_readLE32((const uint32_t*)p, endian) * PRIME32_2; v4 = XXH_rotl32(v4, 13); v4 *= PRIME32_1; p+=4;
33265f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe        } while (p<=limit);
33365f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
33465f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe        state->v1 = v1;
33565f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe        state->v2 = v2;
33665f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe        state->v3 = v3;
33765f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe        state->v4 = v4;
33865f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    }
33965f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
34065f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    if (p < bEnd)
34165f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    {
34265f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe        memcpy(state->memory, p, bEnd-p);
34365f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe        state->memsize = (int)(bEnd-p);
34465f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    }
34565f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
34665f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    return XXH_OK;
34765f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe}
34865f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
34965f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens AxboeXXH_errorcode XXH32_update (void* state_in, const void* input, int len)
35065f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe{
35165f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    XXH_endianess endian_detected = (XXH_endianess)XXH_CPU_LITTLE_ENDIAN;
35265f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
35365f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT)
35465f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe        return XXH32_update_endian(state_in, input, len, XXH_littleEndian);
35565f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    else
35665f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe        return XXH32_update_endian(state_in, input, len, XXH_bigEndian);
35765f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe}
35865f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
35965f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
36065f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
36110aa136bddbaa7c845ab4eacb4a9a4a88d6657a3Jens Axboestatic uint32_t XXH32_intermediateDigest_endian (void* state_in, XXH_endianess endian)
36265f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe{
36365f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    struct XXH_state32_t * state = (struct XXH_state32_t *) state_in;
36465f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    const uint8_t *p = (const uint8_t *)state->memory;
36565f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    uint8_t * bEnd = (uint8_t *)state->memory + state->memsize;
36665f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    uint32_t h32;
36765f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
36865f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    if (state->total_len >= 16)
36965f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    {
37065f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe        h32 = XXH_rotl32(state->v1, 1) + XXH_rotl32(state->v2, 7) + XXH_rotl32(state->v3, 12) + XXH_rotl32(state->v4, 18);
37165f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    }
37265f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    else
37365f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    {
37465f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe        h32  = state->seed + PRIME32_5;
37565f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    }
37665f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
37765f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    h32 += (uint32_t) state->total_len;
37865f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
37965f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    while (p<=bEnd-4)
38065f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    {
38165f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe        h32 += XXH_readLE32((const uint32_t*)p, endian) * PRIME32_3;
38265f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe        h32  = XXH_rotl32(h32, 17) * PRIME32_4;
38365f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe        p+=4;
38465f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    }
38565f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
38665f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    while (p<bEnd)
38765f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    {
38865f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe        h32 += (*p) * PRIME32_5;
38965f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe        h32 = XXH_rotl32(h32, 11) * PRIME32_1;
39065f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe        p++;
39165f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    }
39265f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
39365f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    h32 ^= h32 >> 15;
39465f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    h32 *= PRIME32_2;
39565f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    h32 ^= h32 >> 13;
39665f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    h32 *= PRIME32_3;
39765f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    h32 ^= h32 >> 16;
39865f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
39965f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    return h32;
40065f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe}
40165f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
40265f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
40365f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboeuint32_t XXH32_intermediateDigest (void* state_in)
40465f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe{
40565f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    XXH_endianess endian_detected = (XXH_endianess)XXH_CPU_LITTLE_ENDIAN;
40665f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
40765f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT)
40865f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe        return XXH32_intermediateDigest_endian(state_in, XXH_littleEndian);
40965f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    else
41065f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe        return XXH32_intermediateDigest_endian(state_in, XXH_bigEndian);
41165f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe}
41265f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
41365f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
41465f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboeuint32_t XXH32_digest (void* state_in)
41565f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe{
41665f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    uint32_t h32 = XXH32_intermediateDigest(state_in);
41765f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
41865f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    free(state_in);
41965f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe
42065f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe    return h32;
42165f21d61d5d0796335ceb3320b8846e4d6d30ac7Jens Axboe}
422