xxhash-ffi 0.1.0.0 → 0.1.0.1
raw patch · 3 files changed
+296/−1 lines, 3 files
Files
- src-c/xxhash.h +293/−0
- test/Spec.hs +1/−0
- xxhash-ffi.cabal +2/−1
+ src-c/xxhash.h view
@@ -0,0 +1,293 @@+/*+ xxHash - Extremely Fast Hash algorithm+ Header File+ Copyright (C) 2012-2016, Yann Collet.++ 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 :+ - xxHash source repository : https://github.com/Cyan4973/xxHash+*/++/* 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 @3GHz)++Name Speed Q.Score Author+xxHash 5.4 GB/s 10+CrapWow 3.2 GB/s 2 Andrew+MumurHash 3a 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+CRC32 0.43 GB/s 9+MD5-32 0.33 GB/s 10 Ronald L. Rivest+SHA1-32 0.28 GB/s 10++Q.Score is a measure of quality of the hash function.+It depends on successfully passing SMHasher test set.+10 is a perfect score.++A 64-bits version, named XXH64, is available since r35.+It offers much better speed, but for 64-bits applications only.+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+*/++#ifndef XXHASH_H_5627135585666179+#define XXHASH_H_5627135585666179 1++#if defined (__cplusplus)+extern "C" {+#endif+++/* ****************************+* Definitions+******************************/+#include <stddef.h> /* size_t */+typedef enum { XXH_OK=0, XXH_ERROR } XXH_errorcode;+++/* ****************************+* API modifier+******************************/+/** XXH_PRIVATE_API+* This is useful to include xxhash functions in `static` mode+* in order to inline them, and remove their symbol from the public list.+* Methodology :+* #define XXH_PRIVATE_API+* #include "xxhash.h"+* `xxhash.c` is automatically included.+* It's not useful to compile and link it as a separate module.+*/+#ifdef XXH_PRIVATE_API+# ifndef XXH_STATIC_LINKING_ONLY+# define XXH_STATIC_LINKING_ONLY+# endif+# if defined(__GNUC__)+# define XXH_PUBLIC_API static __inline __attribute__((unused))+# 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+# define XXH_PUBLIC_API static /* this version may generate warnings for unused static functions; disable the relevant warning */+# endif+#else+# define XXH_PUBLIC_API /* do nothing */+#endif /* XXH_PRIVATE_API */++/*!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.+*/+#ifdef XXH_NAMESPACE+# define XXH_CAT(A,B) A##B+# define XXH_NAME2(A,B) XXH_CAT(A,B)+# define XXH_versionNumber XXH_NAME2(XXH_NAMESPACE, XXH_versionNumber)+# define XXH32 XXH_NAME2(XXH_NAMESPACE, XXH32)+# 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)+# define XXH32_copyState XXH_NAME2(XXH_NAMESPACE, XXH32_copyState)+# define XXH32_canonicalFromHash XXH_NAME2(XXH_NAMESPACE, XXH32_canonicalFromHash)+# define XXH32_hashFromCanonical XXH_NAME2(XXH_NAMESPACE, XXH32_hashFromCanonical)+# 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)+# define XXH64_hashFromCanonical XXH_NAME2(XXH_NAMESPACE, XXH64_hashFromCanonical)+#endif+++/* *************************************+* Version+***************************************/+#define XXH_VERSION_MAJOR 0+#define XXH_VERSION_MINOR 6+#define XXH_VERSION_RELEASE 2+#define XXH_VERSION_NUMBER (XXH_VERSION_MAJOR *100*100 + XXH_VERSION_MINOR *100 + XXH_VERSION_RELEASE)+XXH_PUBLIC_API unsigned XXH_versionNumber (void);+++/*-**********************************************************************+* 32-bits hash+************************************************************************/+typedef unsigned int XXH32_hash_t;++/*! XXH32() :+ Calculate the 32-bits hash of sequence "length" bytes stored at memory address "input".+ The memory between input & input+length must be valid (allocated and read-accessible).+ "seed" can be used to alter the result predictably.+ 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);++/*====== Streaming ======*/+typedef struct XXH32_state_s XXH32_state_t; /* incomplete type */+XXH_PUBLIC_API XXH32_state_t* XXH32_createState(void);+XXH_PUBLIC_API XXH_errorcode XXH32_freeState(XXH32_state_t* statePtr);+XXH_PUBLIC_API void XXH32_copyState(XXH32_state_t* dst_state, const XXH32_state_t* src_state);++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);+XXH_PUBLIC_API XXH32_hash_t XXH32_digest (const XXH32_state_t* statePtr);++/*+These 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 input, prefer `XXH32()` and `XXH64()` .++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.+Obviously, input must be allocated and read accessible.+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.+*/++/*====== Canonical representation ======*/++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);++/* Default result type for XXH functions are primitive unsigned 32 and 64 bits.+* 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.+*/+++#ifndef XXH_NO_LONG_LONG+/*-**********************************************************************+* 64-bits hash+************************************************************************/+typedef unsigned long long XXH64_hash_t;++/*! XXH64() :+ Calculate the 64-bits hash of sequence of length "len" stored at memory address "input".+ "seed" can be used to alter the result predictably.+ This function runs faster on 64-bits systems, but slower on 32-bits systems (see benchmark).+*/+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);+XXH_PUBLIC_API void XXH64_copyState(XXH64_state_t* dst_state, const XXH64_state_t* src_state);++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);+#endif /* XXH_NO_LONG_LONG */+++#ifdef XXH_STATIC_LINKING_ONLY++/* ================================================================================================+ This section contains definitions which are not guaranteed to remain stable.+ They may change in future versions, becoming incompatible with a different version of the library.+ They shall only be used with static linking.+ Never use these definitions in association with dynamic linking !+=================================================================================================== */++/* These definitions are only meant to make possible+ static allocation of XXH state, on stack or in a struct for example.+ Never use members directly. */++struct XXH32_state_s {+ unsigned total_len_32;+ unsigned large_len;+ unsigned v1;+ unsigned v2;+ unsigned v3;+ unsigned v4;+ unsigned mem32[4]; /* buffer defined as U32 for alignment */+ unsigned memsize;+ unsigned reserved; /* never read nor write, will be removed in a future version */+}; /* typedef'd to XXH32_state_t */++#ifndef XXH_NO_LONG_LONG /* remove 64-bits support */+struct XXH64_state_s {+ unsigned long long total_len;+ unsigned long long v1;+ unsigned long long v2;+ unsigned long long v3;+ unsigned long long v4;+ unsigned long long mem64[4]; /* buffer defined as U64 for alignment */+ unsigned memsize;+ unsigned reserved[2]; /* never read nor write, will be removed in a future version */+}; /* typedef'd to XXH64_state_t */+#endif++#ifdef XXH_PRIVATE_API+# include "xxhash.c" /* include xxhash function bodies as `static`, for inlining */+#endif++#endif /* XXH_STATIC_LINKING_ONLY */+++#if defined (__cplusplus)+}+#endif++#endif /* XXHASH_H_5627135585666179 */
test/Spec.hs view
@@ -1,5 +1,6 @@ {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE ScopedTypeVariables #-}+{-# OPTIONS_GHC -fno-warn-orphans #-} module Main where import Test.Hspec
xxhash-ffi.cabal view
@@ -1,5 +1,5 @@ name: xxhash-ffi-version: 0.1.0.0+version: 0.1.0.1 synopsis: Bindings to the C implementation the xxHash algorithm description: Bindings to the C implementation the xxHash algorithm. xxHash provides 32-bit and 64-bit extremely fast non-cryptographic hash functions. homepage: https://github.com/haskell-haskey/xxhash-ffi#readme@@ -21,6 +21,7 @@ ghc-options: -Wall default-language: Haskell2010 c-sources: src-c/xxhash.c+ install-includes: src-c/xxhash.h include-dirs: src-c includes: xxhash.h