2014-08-15 09:27:04 +00:00
/*
xxHash - Extremely Fast Hash algorithm
Header File
2016-01-04 07:32:38 +00:00
Copyright ( C ) 2012 - 2016 , Yann Collet .
2014-12-09 18:16:15 +00:00
2014-08-15 09:27:04 +00:00
BSD 2 - Clause License ( http : //www.opensource.org/licenses/bsd-license.php)
Redistribution and use in source and binary forms , with or without
modification , are permitted provided that the following conditions are
met :
* Redistributions of source code must retain the above copyright
notice , this list of conditions and the following disclaimer .
* Redistributions in binary form must reproduce the above
copyright notice , this list of conditions and the following disclaimer
in the documentation and / or other materials provided with the
distribution .
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
" AS IS " AND ANY EXPRESS OR IMPLIED WARRANTIES , INCLUDING , BUT NOT
LIMITED TO , THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED . IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT , INDIRECT , INCIDENTAL ,
SPECIAL , EXEMPLARY , OR CONSEQUENTIAL DAMAGES ( INCLUDING , BUT NOT
LIMITED TO , PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES ; LOSS OF USE ,
DATA , OR PROFITS ; OR BUSINESS INTERRUPTION ) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY , WHETHER IN CONTRACT , STRICT LIABILITY , OR TORT
( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE .
You can contact the author at :
2015-05-04 21:56:53 +00:00
- xxHash source repository : https : //github.com/Cyan4973/xxHash
2014-08-15 09:27:04 +00:00
*/
/* Notice extracted from xxHash homepage :
xxHash is an extremely fast Hash algorithm , running at RAM speed limits .
It also successfully passes all tests from the SMHasher suite .
Comparison ( single thread , Windows Seven 32 bits , using SMHasher on a Core 2 Duo @ 3 GHz )
Name Speed Q . Score Author
xxHash 5.4 GB / s 10
CrapWow 3.2 GB / s 2 Andrew
MumurHash 3 a 2.7 GB / s 10 Austin Appleby
SpookyHash 2.0 GB / s 10 Bob Jenkins
SBox 1.4 GB / s 9 Bret Mulvey
Lookup3 1.2 GB / s 9 Bob Jenkins
SuperFastHash 1.2 GB / s 1 Paul Hsieh
CityHash64 1.05 GB / s 10 Pike & Alakuijala
FNV 0.55 GB / s 5 Fowler , Noll , Vo
2019-09-15 00:40:17 +00:00
CRC32 0.43 GB / s † 9
2014-08-15 09:27:04 +00:00
MD5 - 32 0.33 GB / s 10 Ronald L . Rivest
SHA1 - 32 0.28 GB / s 10
2019-09-15 00:40:17 +00:00
Note † : other CRC32 implementations can be over 40 x faster than SMHasher ' s :
http : //fastcompression.blogspot.com/2019/03/presenting-xxh3.html?showComment=1552696407071#c3490092340461170735
2014-08-15 09:27:04 +00:00
Q . Score is a measure of quality of the hash function .
It depends on successfully passing SMHasher test set .
10 is a perfect score .
2015-05-04 21:56:53 +00:00
2017-12-26 01:57:24 +00:00
A 64 - bit version , named XXH64 , is available since r35 .
It offers much better speed , but for 64 - bit applications only .
2015-05-04 21:56:53 +00:00
Name Speed on 64 bits Speed on 32 bits
XXH64 13.8 GB / s 1.9 GB / s
XXH32 6.8 GB / s 6.0 GB / s
2014-08-15 09:27:04 +00:00
*/
2016-01-07 22:24:04 +00:00
# ifndef XXHASH_H_5627135585666179
# define XXHASH_H_5627135585666179 1
2014-08-15 09:27:04 +00:00
# if defined (__cplusplus)
extern " C " {
# endif
2016-01-03 22:56:13 +00:00
/* ****************************
2015-05-04 21:56:53 +00:00
* Definitions
2016-01-03 22:56:13 +00:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2014-09-25 16:30:15 +00:00
# include <stddef.h> /* size_t */
2014-08-15 09:27:04 +00:00
typedef enum { XXH_OK = 0 , XXH_ERROR } XXH_errorcode ;
2016-01-03 22:56:13 +00:00
/* ****************************
2018-04-18 21:27:00 +00:00
* API modifier
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2018-03-13 22:52:21 +00:00
/** XXH_INLINE_ALL (and XXH_PRIVATE_API)
2019-07-26 19:00:13 +00:00
* This build macro includes xxhash functions in ` static ` mode
2018-04-18 21:27:00 +00:00
* in order to inline them , and remove their symbol from the public list .
2019-07-26 19:00:13 +00:00
* Inlining offers great performance improvement on small keys ,
* and dramatic ones when length is expressed as a compile - time constant .
* See https : //fastcompression.blogspot.com/2018/03/xxhash-for-small-keys-impressive-power.html .
2018-04-18 21:27:00 +00:00
* Methodology :
* # define XXH_INLINE_ALL
* # include " xxhash.h "
* ` xxhash . c ` is automatically included .
2019-07-26 19:00:13 +00:00
* It ' s not useful to compile and link it as a separate object .
2018-04-18 21:27:00 +00:00
*/
2018-03-13 22:52:21 +00:00
# if defined(XXH_INLINE_ALL) || defined(XXH_PRIVATE_API)
2016-06-06 12:12:27 +00:00
# ifndef XXH_STATIC_LINKING_ONLY
# define XXH_STATIC_LINKING_ONLY
# endif
2016-01-04 07:32:38 +00:00
# if defined(__GNUC__)
2016-08-10 05:00:29 +00:00
# define XXH_PUBLIC_API static __inline __attribute__((unused))
2016-01-04 07:32:38 +00:00
# elif defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */ )
# define XXH_PUBLIC_API static inline
# elif defined(_MSC_VER)
# define XXH_PUBLIC_API static __inline
# else
2017-10-09 19:26:59 +00:00
/* this version may generate warnings for unused static functions */
# define XXH_PUBLIC_API static
2016-01-04 07:32:38 +00:00
# endif
# else
2019-03-16 16:45:49 +00:00
# if defined(WIN32) && defined(_MSC_VER) && (defined(XXH_IMPORT) || defined(XXH_EXPORT))
2019-02-12 21:15:58 +00:00
# ifdef XXH_EXPORT
# define XXH_PUBLIC_API __declspec(dllexport)
2019-03-16 16:45:49 +00:00
# elif XXH_IMPORT
2019-02-12 21:15:58 +00:00
# define XXH_PUBLIC_API __declspec(dllimport)
# endif
# else
# define XXH_PUBLIC_API /* do nothing */
# endif
2018-03-13 22:52:21 +00:00
# endif /* XXH_INLINE_ALL || XXH_PRIVATE_API */
2015-06-28 11:20:23 +00:00
2018-04-18 21:27:00 +00:00
/*! XXH_NAMESPACE, aka Namespace Emulation :
*
* If you want to include _and expose_ xxHash functions from within your own library ,
* but also want to avoid symbol collisions with other libraries which may also include xxHash ,
*
* you can use XXH_NAMESPACE , to automatically prefix any public symbol from xxhash library
* with the value of XXH_NAMESPACE ( therefore , avoid NULL and numeric values ) .
*
* Note that no change is required within the calling program as long as it includes ` xxhash . h ` :
* regular symbol name will be automatically translated by this header .
*/
2015-06-28 11:20:23 +00:00
# ifdef XXH_NAMESPACE
# define XXH_CAT(A,B) A##B
# define XXH_NAME2(A,B) XXH_CAT(A,B)
2016-01-04 05:49:41 +00:00
# define XXH_versionNumber XXH_NAME2(XXH_NAMESPACE, XXH_versionNumber)
2016-08-10 22:53:10 +00:00
# define XXH32 XXH_NAME2(XXH_NAMESPACE, XXH32)
2015-06-28 11:20:23 +00:00
# define XXH32_createState XXH_NAME2(XXH_NAMESPACE, XXH32_createState)
# define XXH32_freeState XXH_NAME2(XXH_NAMESPACE, XXH32_freeState)
# define XXH32_reset XXH_NAME2(XXH_NAMESPACE, XXH32_reset)
# define XXH32_update XXH_NAME2(XXH_NAMESPACE, XXH32_update)
# define XXH32_digest XXH_NAME2(XXH_NAMESPACE, XXH32_digest)
2016-06-24 10:19:16 +00:00
# define XXH32_copyState XXH_NAME2(XXH_NAMESPACE, XXH32_copyState)
2016-07-10 10:56:59 +00:00
# define XXH32_canonicalFromHash XXH_NAME2(XXH_NAMESPACE, XXH32_canonicalFromHash)
# define XXH32_hashFromCanonical XXH_NAME2(XXH_NAMESPACE, XXH32_hashFromCanonical)
2016-08-10 22:53:10 +00:00
# define XXH64 XXH_NAME2(XXH_NAMESPACE, XXH64)
# define XXH64_createState XXH_NAME2(XXH_NAMESPACE, XXH64_createState)
# define XXH64_freeState XXH_NAME2(XXH_NAMESPACE, XXH64_freeState)
# define XXH64_reset XXH_NAME2(XXH_NAMESPACE, XXH64_reset)
# define XXH64_update XXH_NAME2(XXH_NAMESPACE, XXH64_update)
# define XXH64_digest XXH_NAME2(XXH_NAMESPACE, XXH64_digest)
# define XXH64_copyState XXH_NAME2(XXH_NAMESPACE, XXH64_copyState)
# define XXH64_canonicalFromHash XXH_NAME2(XXH_NAMESPACE, XXH64_canonicalFromHash)
2016-07-10 10:56:59 +00:00
# define XXH64_hashFromCanonical XXH_NAME2(XXH_NAMESPACE, XXH64_hashFromCanonical)
2015-06-28 11:20:23 +00:00
# endif
2014-08-15 09:27:04 +00:00
2016-01-04 05:49:41 +00:00
/* *************************************
* Version
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2016-01-06 00:28:36 +00:00
# define XXH_VERSION_MAJOR 0
2019-03-11 22:09:27 +00:00
# define XXH_VERSION_MINOR 7
2019-09-28 00:55:33 +00:00
# define XXH_VERSION_RELEASE 2
2016-01-04 05:49:41 +00:00
# define XXH_VERSION_NUMBER (XXH_VERSION_MAJOR *100*100 + XXH_VERSION_MINOR *100 + XXH_VERSION_RELEASE)
2016-01-04 07:32:38 +00:00
XXH_PUBLIC_API unsigned XXH_versionNumber ( void ) ;
2016-01-04 05:49:41 +00:00
2016-08-10 22:53:10 +00:00
/*-**********************************************************************
2017-12-26 01:57:24 +00:00
* 32 - bit hash
2016-08-10 22:53:10 +00:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2019-05-05 03:10:52 +00:00
# if !defined (__VMS) \
& & ( defined ( __cplusplus ) \
| | ( defined ( __STDC_VERSION__ ) & & ( __STDC_VERSION__ > = 199901L ) /* C99 */ ) )
# include <stdint.h>
typedef uint32_t XXH32_hash_t ;
# else
typedef unsigned int XXH32_hash_t ;
# endif
2014-08-15 09:27:04 +00:00
2016-08-10 22:53:10 +00:00
/*! XXH32() :
2017-12-26 01:57:24 +00:00
Calculate the 32 - bit hash of sequence " length " bytes stored at memory address " input " .
2014-09-25 16:30:15 +00:00
The memory between input & input + length must be valid ( allocated and read - accessible ) .
2014-08-15 09:27:04 +00:00
" seed " can be used to alter the result predictably .
2016-08-10 22:53:10 +00:00
Speed on Core 2 Duo @ 3 GHz ( single thread , SMHasher benchmark ) : 5.4 GB / s */
XXH_PUBLIC_API XXH32_hash_t XXH32 ( const void * input , size_t length , unsigned int seed ) ;
2014-08-15 09:27:04 +00:00
2016-08-10 22:53:10 +00:00
/*====== Streaming ======*/
2016-01-10 16:06:34 +00:00
typedef struct XXH32_state_s XXH32_state_t ; /* incomplete type */
2016-01-04 07:32:38 +00:00
XXH_PUBLIC_API XXH32_state_t * XXH32_createState ( void ) ;
XXH_PUBLIC_API XXH_errorcode XXH32_freeState ( XXH32_state_t * statePtr ) ;
2016-09-02 04:29:02 +00:00
XXH_PUBLIC_API void XXH32_copyState ( XXH32_state_t * dst_state , const XXH32_state_t * src_state ) ;
2014-08-15 09:27:04 +00:00
2016-01-04 07:32:38 +00:00
XXH_PUBLIC_API XXH_errorcode XXH32_reset ( XXH32_state_t * statePtr , unsigned int seed ) ;
XXH_PUBLIC_API XXH_errorcode XXH32_update ( XXH32_state_t * statePtr , const void * input , size_t length ) ;
2016-01-14 02:01:39 +00:00
XXH_PUBLIC_API XXH32_hash_t XXH32_digest ( const XXH32_state_t * statePtr ) ;
2014-09-25 16:30:15 +00:00
2016-06-21 06:29:40 +00:00
/*
2018-04-18 21:27:00 +00:00
* Streaming functions generate the xxHash of an input provided in multiple segments .
* Note that , for small input , they are slower than single - call functions , due to state management .
* For small inputs , prefer ` XXH32 ( ) ` and ` XXH64 ( ) ` , which are better optimized .
*
* XXH state must first be allocated , using XXH * _createState ( ) .
*
* Start a new hash by initializing state with a seed , using XXH * _reset ( ) .
*
* Then , feed the hash state by calling XXH * _update ( ) as many times as necessary .
* The function returns an error code , with 0 meaning OK , and any other value meaning there is an error .
*
* Finally , a hash value can be produced anytime , by using XXH * _digest ( ) .
* This function returns the nn - bits hash as an int or long long .
*
* It ' s still possible to continue inserting input into the hash state after a digest ,
* and generate some new hashes later on , by calling again XXH * _digest ( ) .
*
* When done , free XXH state space if it was allocated dynamically .
*/
2014-08-15 09:27:04 +00:00
2016-08-10 22:53:10 +00:00
/*====== Canonical representation ======*/
2014-08-15 09:27:04 +00:00
2016-01-14 02:01:39 +00:00
typedef struct { unsigned char digest [ 4 ] ; } XXH32_canonical_t ;
XXH_PUBLIC_API void XXH32_canonicalFromHash ( XXH32_canonical_t * dst , XXH32_hash_t hash ) ;
XXH_PUBLIC_API XXH32_hash_t XXH32_hashFromCanonical ( const XXH32_canonical_t * src ) ;
2016-06-21 06:29:40 +00:00
/* Default result type for XXH functions are primitive unsigned 32 and 64 bits.
2018-04-18 21:27:00 +00:00
* The canonical representation uses human - readable write convention , aka big - endian ( large digits first ) .
* These functions allow transformation of hash result into and from its canonical format .
* This way , hash values can be written into a file / memory , and remain comparable on different systems and programs .
*/
2016-01-11 00:31:04 +00:00
2016-08-10 22:53:10 +00:00
# ifndef XXH_NO_LONG_LONG
/*-**********************************************************************
2017-12-26 01:57:24 +00:00
* 64 - bit hash
2016-08-10 22:53:10 +00:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2019-05-05 03:10:52 +00:00
# if !defined (__VMS) \
& & ( defined ( __cplusplus ) \
| | ( defined ( __STDC_VERSION__ ) & & ( __STDC_VERSION__ > = 199901L ) /* C99 */ ) )
# include <stdint.h>
typedef uint64_t XXH64_hash_t ;
# else
typedef unsigned long long XXH64_hash_t ;
# endif
2016-08-10 22:53:10 +00:00
/*! XXH64() :
2017-12-26 01:57:24 +00:00
Calculate the 64 - bit hash of sequence of length " len " stored at memory address " input " .
2016-08-10 22:53:10 +00:00
" seed " can be used to alter the result predictably .
2017-12-26 01:57:24 +00:00
This function runs faster on 64 - bit systems , but slower on 32 - bit systems ( see benchmark ) .
2016-08-10 22:53:10 +00:00
*/
XXH_PUBLIC_API XXH64_hash_t XXH64 ( const void * input , size_t length , unsigned long long seed ) ;
/*====== Streaming ======*/
typedef struct XXH64_state_s XXH64_state_t ; /* incomplete type */
XXH_PUBLIC_API XXH64_state_t * XXH64_createState ( void ) ;
XXH_PUBLIC_API XXH_errorcode XXH64_freeState ( XXH64_state_t * statePtr ) ;
2016-09-02 04:29:02 +00:00
XXH_PUBLIC_API void XXH64_copyState ( XXH64_state_t * dst_state , const XXH64_state_t * src_state ) ;
2016-08-10 22:53:10 +00:00
XXH_PUBLIC_API XXH_errorcode XXH64_reset ( XXH64_state_t * statePtr , unsigned long long seed ) ;
XXH_PUBLIC_API XXH_errorcode XXH64_update ( XXH64_state_t * statePtr , const void * input , size_t length ) ;
XXH_PUBLIC_API XXH64_hash_t XXH64_digest ( const XXH64_state_t * statePtr ) ;
/*====== Canonical representation ======*/
typedef struct { unsigned char digest [ 8 ] ; } XXH64_canonical_t ;
XXH_PUBLIC_API void XXH64_canonicalFromHash ( XXH64_canonical_t * dst , XXH64_hash_t hash ) ;
XXH_PUBLIC_API XXH64_hash_t XXH64_hashFromCanonical ( const XXH64_canonical_t * src ) ;
2019-02-26 21:45:56 +00:00
2016-08-10 22:53:10 +00:00
# endif /* XXH_NO_LONG_LONG */
2018-03-22 01:24:19 +00:00
2016-05-28 00:14:28 +00:00
# ifdef XXH_STATIC_LINKING_ONLY
2016-06-21 06:40:48 +00:00
/* ================================================================================================
2017-09-23 21:46:11 +00:00
This section contains declarations which are not guaranteed to remain stable .
2016-08-06 18:35:56 +00:00
They may change in future versions , becoming incompatible with a different version of the library .
2017-09-23 21:46:11 +00:00
These declarations should only be used with static linking .
Never use them in association with dynamic linking !
2016-06-21 06:40:48 +00:00
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
2016-06-06 12:22:56 +00:00
2018-04-18 21:27:00 +00:00
/* These definitions are only present to allow
2018-03-22 01:24:19 +00:00
* static allocation of XXH state , on stack or in a struct for example .
* Never * * ever * * use members directly . */
2016-11-17 18:50:04 +00:00
struct XXH32_state_s {
2019-02-26 21:45:56 +00:00
XXH32_hash_t total_len_32 ;
XXH32_hash_t large_len ;
XXH32_hash_t v1 ;
XXH32_hash_t v2 ;
XXH32_hash_t v3 ;
XXH32_hash_t v4 ;
XXH32_hash_t mem32 [ 4 ] ;
XXH32_hash_t memsize ;
XXH32_hash_t reserved ; /* never read nor write, might be removed in a future version */
2016-11-17 18:50:04 +00:00
} ; /* typedef'd to XXH32_state_t */
2019-05-05 03:10:52 +00:00
# ifndef XXH_NO_LONG_LONG /* remove 64-bit support */
2016-11-17 18:50:04 +00:00
struct XXH64_state_s {
2019-02-26 21:45:56 +00:00
XXH64_hash_t total_len ;
XXH64_hash_t v1 ;
XXH64_hash_t v2 ;
XXH64_hash_t v3 ;
XXH64_hash_t v4 ;
XXH64_hash_t mem64 [ 4 ] ;
XXH32_hash_t memsize ;
2019-09-06 23:05:44 +00:00
XXH32_hash_t reserved32 ; /* required for padding anyway */
XXH64_hash_t reserved64 ; /* never read nor write, might be removed in a future version */
2016-11-17 18:50:04 +00:00
} ; /* typedef'd to XXH64_state_t */
2019-05-05 03:10:52 +00:00
# endif /* XXH_NO_LONG_LONG */
2018-03-22 01:24:19 +00:00
2016-05-28 00:14:28 +00:00
2019-03-11 22:09:27 +00:00
/*-**********************************************************************
* XXH3
* New experimental hash
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2019-03-13 01:13:46 +00:00
# ifndef XXH_NO_LONG_LONG
2019-03-13 19:14:21 +00:00
/* ============================================
* XXH3 is a new hash algorithm ,
2019-07-26 19:28:28 +00:00
* featuring improved speed performance for both small and large inputs .
2019-06-12 17:35:20 +00:00
* See full speed analysis at : http : //fastcompression.blogspot.com/2019/03/presenting-xxh3.html
2019-03-13 19:14:21 +00:00
* In general , expect XXH3 to run about ~ 2 x faster on large inputs ,
2019-07-23 22:33:58 +00:00
* and > 3 x faster on small ones , though exact differences depend on platform .
2019-03-13 19:14:21 +00:00
*
* The algorithm is portable , will generate the same hash on all platforms .
* It benefits greatly from vectorization units , but does not require it .
*
* XXH3 offers 2 variants , _64bits and _128bits .
2019-03-14 20:08:38 +00:00
* When only 64 bits are needed , prefer calling the _64bits variant :
* it reduces the amount of mixing , resulting in faster speed on small inputs .
2019-06-12 17:35:20 +00:00
* It ' s also generally simpler to manipulate a scalar return type than a struct .
2019-03-13 19:14:21 +00:00
*
* The XXH3 algorithm is still considered experimental .
2019-06-12 17:35:20 +00:00
* Produced results can still change between versions .
2019-07-26 19:28:28 +00:00
* For example , results produced by v0 .7 .1 are not comparable with results from v0 .7 .0 .
* It ' s nonetheless possible to use XXH3 for ephemeral data ( local sessions ) ,
* but avoid storing values in long - term storage for later re - use .
2019-03-13 19:14:21 +00:00
*
2019-07-26 19:28:28 +00:00
* The API supports one - shot hashing , streaming mode , and custom secrets .
2019-03-13 19:14:21 +00:00
*
* There are still a number of opened questions that community can influence during the experimental period .
* I ' m trying to list a few of them below , though don ' t consider this list as complete .
*
2019-07-23 22:49:54 +00:00
* - 128 - bits output type : currently defined as a structure of two 64 - bits fields .
2019-03-13 21:44:41 +00:00
* That ' s because 128 - bit values do not exist in C standard .
2019-03-13 19:14:21 +00:00
* Note that it means that , at byte level , result is not identical depending on endianess .
* However , at field level , they are identical on all platforms .
2019-07-26 19:28:28 +00:00
* The canonical representation solves the issue of identical byte - level representation across platforms ,
2019-03-13 19:14:21 +00:00
* which is necessary for serialization .
2019-03-13 21:44:41 +00:00
* Would there be a better representation for a 128 - bit hash result ?
* Are the names of the inner 64 - bit fields important ? Should they be changed ?
2019-03-13 19:14:21 +00:00
*
2019-03-13 21:44:41 +00:00
* - Seed type for 128 - bits variant : currently , it ' s a single 64 - bit value , like the 64 - bit variant .
* It could be argued that it ' s more logical to offer a 128 - bit seed input parameter for a 128 - bit hash .
2019-07-23 22:49:54 +00:00
* But 128 - bit seed is more difficult to use , since it requires to pass a structure instead of a scalar value .
2019-07-26 19:28:28 +00:00
* Such a variant could either replace current one , or become an additional one .
2019-03-13 19:14:21 +00:00
* Farmhash , for example , offers both variants ( the 128 - bits seed variant is called ` doubleSeed ` ) .
2019-03-13 22:08:04 +00:00
* If both 64 - bit and 128 - bit seeds are possible , which variant should be called XXH128 ?
2019-03-13 19:14:21 +00:00
*
2019-06-12 17:35:20 +00:00
* - Result for len = = 0 : Currently , the result of hashing a zero - length input is ` 0 ` .
* It seems okay as a return value when using all " default " secret and seed ( it used to be a request for XXH32 / XXH64 ) .
* But is it still fine to return ` 0 ` when secret or seed are non - default ?
2019-07-26 19:28:28 +00:00
* Are there use cases which could depend on generating a different hash result for zero - length input when the secret is different ?
2019-03-13 19:14:21 +00:00
*/
2019-03-11 22:09:27 +00:00
# ifdef XXH_NAMESPACE
# define XXH3_64bits XXH_NAME2(XXH_NAMESPACE, XXH3_64bits)
2019-06-11 18:13:44 +00:00
# define XXH3_64bits_withSecret XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_withSecret)
2019-03-11 22:09:27 +00:00
# define XXH3_64bits_withSeed XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_withSeed)
2019-06-13 22:56:41 +00:00
2019-07-20 00:28:09 +00:00
# define XXH3_createState XXH_NAME2(XXH_NAMESPACE, XXH3_createState)
# define XXH3_freeState XXH_NAME2(XXH_NAMESPACE, XXH3_freeState)
# define XXH3_copyState XXH_NAME2(XXH_NAMESPACE, XXH3_copyState)
2019-06-13 23:19:51 +00:00
# define XXH3_64bits_reset XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_reset)
2019-06-14 01:22:46 +00:00
# define XXH3_64bits_reset_withSeed XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_reset_withSeed)
# define XXH3_64bits_reset_withSecret XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_reset_withSecret)
2019-06-13 23:19:51 +00:00
# define XXH3_64bits_update XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_update)
# define XXH3_64bits_digest XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_digest)
2019-03-11 22:09:27 +00:00
# endif
2019-03-14 20:08:38 +00:00
2019-06-11 23:40:56 +00:00
/* XXH3_64bits() :
2019-06-12 17:35:20 +00:00
* default 64 - bit variant , using default secret and default seed of 0.
2019-07-26 19:28:28 +00:00
* It ' s the fastest variant . */
2019-06-12 00:26:30 +00:00
XXH_PUBLIC_API XXH64_hash_t XXH3_64bits ( const void * data , size_t len ) ;
2019-03-13 22:08:04 +00:00
2019-06-11 23:40:56 +00:00
/* XXH3_64bits_withSecret() :
* It ' s possible to provide any blob of bytes as a " secret " to generate the hash .
2019-06-12 00:26:30 +00:00
* This makes it more difficult for an external actor to prepare an intentional collision .
2019-06-17 21:16:52 +00:00
* The secret * must * be large enough ( > = XXH3_SECRET_SIZE_MIN ) .
2019-06-14 18:34:24 +00:00
* It should consist of random bytes .
2019-07-26 19:28:28 +00:00
* Avoid repeating same character , or sequences of bytes ,
* and especially avoid swathes of \ 0.
* Failure to respect these conditions will result in a poor quality hash .
2019-06-11 23:40:56 +00:00
*/
2019-06-17 21:16:52 +00:00
# define XXH3_SECRET_SIZE_MIN 136
2019-06-12 00:26:30 +00:00
XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_withSecret ( const void * data , size_t len , const void * secret , size_t secretSize ) ;
2019-03-11 22:09:27 +00:00
2019-06-11 23:40:56 +00:00
/* XXH3_64bits_withSeed() :
* This variant generates on the fly a custom secret ,
* based on the default secret , altered using the ` seed ` value .
* While this operation is decently fast , note that it ' s not completely free .
* note : seed = = 0 produces same results as XXH3_64bits ( ) */
2019-06-12 00:26:30 +00:00
XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_withSeed ( const void * data , size_t len , XXH64_hash_t seed ) ;
2019-03-11 22:09:27 +00:00
2019-05-05 03:10:52 +00:00
2019-06-13 22:56:41 +00:00
/* streaming 64-bit */
2019-05-05 03:10:52 +00:00
# if defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) /* C11+ */
# include <stdalign.h>
2019-06-13 22:56:41 +00:00
# define XXH_ALIGN(n) alignas(n)
2019-05-05 03:10:52 +00:00
# elif defined(__GNUC__)
2019-06-13 22:56:41 +00:00
# define XXH_ALIGN(n) __attribute__ ((aligned(n)))
2019-05-05 03:10:52 +00:00
# elif defined(_MSC_VER)
2019-06-13 22:56:41 +00:00
# define XXH_ALIGN(n) __declspec(align(n))
2019-05-05 03:10:52 +00:00
# else
2019-06-13 22:56:41 +00:00
# define XXH_ALIGN(n) /* disabled */
2019-05-05 03:10:52 +00:00
# endif
typedef struct XXH3_state_s XXH3_state_t ;
2019-06-17 21:16:52 +00:00
# define XXH3_SECRET_DEFAULT_SIZE 192 /* minimum XXH3_SECRET_SIZE_MIN */
# define XXH3_INTERNALBUFFER_SIZE 256
2019-05-05 03:10:52 +00:00
struct XXH3_state_s {
2019-06-13 22:56:41 +00:00
XXH_ALIGN ( 64 ) XXH64_hash_t acc [ 8 ] ;
2019-10-01 22:52:21 +00:00
XXH_ALIGN ( 64 ) unsigned char customSecret [ XXH3_SECRET_DEFAULT_SIZE ] ; /* used to store a custom secret generated from the seed. Makes state larger. Design might change */
XXH_ALIGN ( 64 ) unsigned char buffer [ XXH3_INTERNALBUFFER_SIZE ] ;
2019-05-05 03:10:52 +00:00
XXH32_hash_t bufferedSize ;
2019-06-14 01:22:46 +00:00
XXH32_hash_t nbStripesPerBlock ;
XXH32_hash_t nbStripesSoFar ;
2019-09-06 23:05:44 +00:00
XXH32_hash_t secretLimit ;
2019-05-05 03:10:52 +00:00
XXH32_hash_t reserved32 ;
2019-06-14 01:22:46 +00:00
XXH32_hash_t reserved32_2 ;
XXH64_hash_t totalLen ;
2019-05-05 03:10:52 +00:00
XXH64_hash_t seed ;
2019-06-14 01:22:46 +00:00
XXH64_hash_t reserved64 ;
2019-10-01 22:52:21 +00:00
const unsigned char * secret ; /* note : there is some padding after, due to alignment on 64 bytes */
2019-05-05 03:10:52 +00:00
} ; /* typedef'd to XXH3_state_t */
2019-06-14 18:34:24 +00:00
/* Streaming requires state maintenance.
* This operation costs memory and cpu .
* As a consequence , streaming is slower than one - shot hashing .
2019-07-23 22:33:58 +00:00
* For better performance , prefer using one - shot functions whenever possible . */
2019-06-14 18:34:24 +00:00
2019-07-23 23:12:13 +00:00
XXH_PUBLIC_API XXH3_state_t * XXH3_createState ( void ) ;
XXH_PUBLIC_API XXH_errorcode XXH3_freeState ( XXH3_state_t * statePtr ) ;
XXH_PUBLIC_API void XXH3_copyState ( XXH3_state_t * dst_state , const XXH3_state_t * src_state ) ;
2019-05-05 03:10:52 +00:00
2019-06-14 01:22:46 +00:00
/* XXH3_64bits_reset() :
* initialize with default parameters .
2019-07-23 22:33:58 +00:00
* result will be equivalent to ` XXH3_64bits ( ) ` . */
2019-06-14 01:22:46 +00:00
XXH_PUBLIC_API XXH_errorcode XXH3_64bits_reset ( XXH3_state_t * statePtr ) ;
2019-06-14 18:34:24 +00:00
/* XXH3_64bits_reset_withSeed() :
* generate a custom secret from ` seed ` , and store it into state .
2019-07-23 22:33:58 +00:00
* digest will be equivalent to ` XXH3_64bits_withSeed ( ) ` . */
2019-06-14 01:22:46 +00:00
XXH_PUBLIC_API XXH_errorcode XXH3_64bits_reset_withSeed ( XXH3_state_t * statePtr , XXH64_hash_t seed ) ;
/* XXH3_64bits_reset_withSecret() :
* ` secret ` is referenced , and must outlive the hash streaming session .
2019-06-17 21:16:52 +00:00
* secretSize must be > = XXH3_SECRET_SIZE_MIN .
2019-06-14 01:22:46 +00:00
*/
XXH_PUBLIC_API XXH_errorcode XXH3_64bits_reset_withSecret ( XXH3_state_t * statePtr , const void * secret , size_t secretSize ) ;
2019-06-13 23:19:51 +00:00
XXH_PUBLIC_API XXH_errorcode XXH3_64bits_update ( XXH3_state_t * statePtr , const void * input , size_t length ) ;
XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_digest ( const XXH3_state_t * statePtr ) ;
2019-05-05 03:10:52 +00:00
2019-06-13 22:56:41 +00:00
/* 128-bit */
2019-07-23 22:33:58 +00:00
# ifdef XXH_NAMESPACE
# define XXH128 XXH_NAME2(XXH_NAMESPACE, XXH128)
# define XXH3_128bits XXH_NAME2(XXH_NAMESPACE, XXH3_128bits)
# define XXH3_128bits_withSeed XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_withSeed)
# define XXH3_128bits_withSecret XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_withSecret)
# define XXH3_128bits_reset XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_reset)
# define XXH3_128bits_reset_withSeed XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_reset_withSeed)
# define XXH3_128bits_reset_withSecret XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_reset_withSecret)
# define XXH3_128bits_update XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_update)
# define XXH3_128bits_digest XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_digest)
2019-07-23 23:12:13 +00:00
# define XXH128_isEqual XXH_NAME2(XXH_NAMESPACE, XXH128_isEqual)
# define XXH128_cmp XXH_NAME2(XXH_NAMESPACE, XXH128_cmp)
# define XXH128_canonicalFromHash XXH_NAME2(XXH_NAMESPACE, XXH128_canonicalFromHash)
# define XXH128_hashFromCanonical XXH_NAME2(XXH_NAMESPACE, XXH128_hashFromCanonical)
2019-07-23 22:33:58 +00:00
# endif
2019-03-14 20:08:38 +00:00
typedef struct {
XXH64_hash_t low64 ;
XXH64_hash_t high64 ;
} XXH128_hash_t ;
2019-07-18 22:29:22 +00:00
XXH_PUBLIC_API XXH128_hash_t XXH128 ( const void * data , size_t len , XXH64_hash_t seed ) ;
2019-03-13 01:13:46 +00:00
XXH_PUBLIC_API XXH128_hash_t XXH3_128bits ( const void * data , size_t len ) ;
2019-06-11 18:13:44 +00:00
XXH_PUBLIC_API XXH128_hash_t XXH3_128bits_withSeed ( const void * data , size_t len , XXH64_hash_t seed ) ; /* == XXH128() */
2019-07-18 22:29:22 +00:00
XXH_PUBLIC_API XXH128_hash_t XXH3_128bits_withSecret ( const void * data , size_t len , const void * secret , size_t secretSize ) ;
2019-03-11 22:09:27 +00:00
2019-07-03 16:09:57 +00:00
XXH_PUBLIC_API XXH_errorcode XXH3_128bits_reset ( XXH3_state_t * statePtr ) ;
2019-07-20 00:28:09 +00:00
XXH_PUBLIC_API XXH_errorcode XXH3_128bits_reset_withSeed ( XXH3_state_t * statePtr , XXH64_hash_t seed ) ;
XXH_PUBLIC_API XXH_errorcode XXH3_128bits_reset_withSecret ( XXH3_state_t * statePtr , const void * secret , size_t secretSize ) ;
XXH_PUBLIC_API XXH_errorcode XXH3_128bits_update ( XXH3_state_t * statePtr , const void * input , size_t length ) ;
2019-07-03 16:09:57 +00:00
XXH_PUBLIC_API XXH128_hash_t XXH3_128bits_digest ( const XXH3_state_t * statePtr ) ;
2019-03-11 22:09:27 +00:00
2019-05-05 03:10:52 +00:00
2019-07-26 19:00:13 +00:00
/* Note : for better performance, following functions should be inlined,
* using XXH_INLINE_ALL */
2019-07-23 01:39:47 +00:00
/* return : 1 is equal, 0 if different */
2019-07-23 22:33:58 +00:00
XXH_PUBLIC_API int XXH128_isEqual ( XXH128_hash_t h1 , XXH128_hash_t h2 ) ;
2019-07-23 01:39:47 +00:00
2019-07-23 23:12:13 +00:00
/* This comparator is compatible with stdlib's qsort().
2019-07-23 01:39:47 +00:00
* return : > 0 if * h128_1 > * h128_2
* < 0 if * h128_1 < * h128_2
* = 0 if * h128_1 = = * h128_2 */
2019-07-23 22:33:58 +00:00
XXH_PUBLIC_API int XXH128_cmp ( const void * h128_1 , const void * h128_2 ) ;
2019-07-23 01:39:47 +00:00
2019-07-23 22:49:54 +00:00
/*====== Canonical representation ======*/
typedef struct { unsigned char digest [ 16 ] ; } XXH128_canonical_t ;
XXH_PUBLIC_API void XXH128_canonicalFromHash ( XXH128_canonical_t * dst , XXH128_hash_t hash ) ;
XXH_PUBLIC_API XXH128_hash_t XXH128_hashFromCanonical ( const XXH128_canonical_t * src ) ;
2019-03-13 01:13:46 +00:00
# endif /* XXH_NO_LONG_LONG */
2019-03-11 22:09:27 +00:00
/*-**********************************************************************
* XXH_INLINE_ALL
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2018-03-13 22:52:21 +00:00
# if defined(XXH_INLINE_ALL) || defined(XXH_PRIVATE_API)
2016-11-17 18:50:04 +00:00
# include "xxhash.c" /* include xxhash function bodies as `static`, for inlining */
# endif
2016-06-06 12:12:27 +00:00
2019-03-11 22:09:27 +00:00
2016-06-06 12:22:56 +00:00
# endif /* XXH_STATIC_LINKING_ONLY */
2016-05-28 00:14:28 +00:00
2014-08-15 09:27:04 +00:00
# if defined (__cplusplus)
}
# endif
2016-01-07 22:24:04 +00:00
# endif /* XXHASH_H_5627135585666179 */