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