Crypt-Komihash
view release on metacpan or search on metacpan
lib/Crypt/komihash.h view on Meta::CPAN
#warning KOMIHASH: cannot determine endianness, assuming little-endian.
#define KOMIHASH_LITTLE_ENDIAN 1
#endif // defined( __BIG_ENDIAN__ )
#endif // !defined( KOMIHASH_LITTLE_ENDIAN )
/**
* @def KOMIHASH_GCC_BUILTINS
* @brief Macro that denotes availability of GCC-style built-in functions.
*/
#if defined( __GNUC__ ) || defined( __clang__ ) || \
defined( __IBMC__ ) || defined( __IBMCPP__ ) || defined( __COMPCERT__ )
#define KOMIHASH_GCC_BUILTINS
#endif // GCC built-ins check
/**
* @def KOMIHASH_EC32( v )
* @brief Macro that appies 32-bit byte-swapping, for endianness-correction.
* @param v Value to byte-swap.
*/
/**
* @def KOMIHASH_EC64( v )
* @brief Macro that appies 64-bit byte-swapping, for endianness-correction.
* @param v Value to byte-swap.
*/
#if KOMIHASH_LITTLE_ENDIAN
#define KOMIHASH_EC32( v ) ( v )
#define KOMIHASH_EC64( v ) ( v )
#else // KOMIHASH_LITTLE_ENDIAN
lib/Crypt/komihash.h view on Meta::CPAN
#if defined( __clang__ )
#define KOMIHASH_PREFETCH_1( a ) KOMIHASH_PREFETCH( a )
#define KOMIHASH_PREFETCH_2( a )
#else // defined( __clang__ )
#define KOMIHASH_PREFETCH_1( a )
#define KOMIHASH_PREFETCH_2( a ) KOMIHASH_PREFETCH( a )
#endif // defined( __clang__ )
/**
* @def KOMIHASH_INLINE
* @brief Macro to force code inlining.
*/
#if defined( KOMIHASH_GCC_BUILTINS )
#define KOMIHASH_INLINE inline __attribute__((always_inline))
#elif defined( _MSC_VER )
#define KOMIHASH_INLINE inline __forceinline
lib/Crypt/komihash.h view on Meta::CPAN
*
* @param u Multiplier 1.
* @param v Multiplier 2.
* @param[out] rl The lower half of the 128-bit result.
* @param[in,out] rha The accumulator to receive the higher half of the
* 128-bit result.
*/
/**
* @def KOMIHASH_EMULU( u, v )
* @brief Macro for 32-bit by 32-bit unsigned multiplication with 64-bit
* result.
* @param u Multiplier 1.
* @param v Multiplier 2.
*/
#if defined( _MSC_VER ) && ( defined( _M_ARM64 ) || \
( defined( _M_X64 ) && defined( __INTEL_COMPILER )))
#include <intrin.h>
lib/Crypt/komihash.h view on Meta::CPAN
const uint64_t w1 = KOMIHASH_EMULU( u0, v1 ) + (uint32_t) t;
*rha += KOMIHASH_EMULU( u1, v1 ) + (uint32_t) ( w1 >> 32 ) +
(uint32_t) ( t >> 32 );
}
#endif // defined( __IBMC__ )
/**
* @def KOMIHASH_HASHROUND()
* @brief Macro for a common hashing round without input.
*
* The three instructions in this macro (multiply, add, and XOR) represent the
* simplest constantless PRNG, scalable to any even-sized state variables,
* with the `Seed1` being the PRNG output (2^64 PRNG period). It passes
* `PractRand` tests with rare non-systematic "unusual" evaluations.
*
* To make this PRNG reliable, self-starting, and eliminate a risk of
* stopping, the following variant can be used, which adds a "register
* checker-board", a source of raw entropy. The PRNG is available as the
* komirand() function. Not required for hashing (but works for it) since the
lib/Crypt/komihash.h view on Meta::CPAN
* (the `0xAAAA...` constant should match register's size; essentially, it is
* a replication of the `10` bit-pair; it is not an arbitrary constant).
*/
#define KOMIHASH_HASHROUND() \
kh_m128( Seed1, Seed5, &Seed1, &Seed5 ); \
Seed1 ^= Seed5;
/**
* @def KOMIHASH_HASH16( m )
* @brief Macro for a common hashing round with 16-byte input.
* @param m Message pointer, alignment is unimportant.
*/
#define KOMIHASH_HASH16( m ) \
kh_m128( Seed1 ^ kh_lu64ec( m ), \
Seed5 ^ kh_lu64ec( m + 8 ), &Seed1, &Seed5 ); \
Seed1 ^= Seed5;
/**
* @def KOMIHASH_HASHFIN()
* @brief Macro for common hashing finalization round.
*
* The final hashing input is expected in the `r1h` and `r2h` temporary
* variables. The macro inserts the function return instruction.
*/
#define KOMIHASH_HASHFIN() \
kh_m128( r1h, r2h, &Seed1, &Seed5 ); \
Seed1 ^= Seed5; \
KOMIHASH_HASHROUND(); \
return( Seed1 );
/**
* @def KOMIHASH_HASHLOOP64()
* @brief Macro for a common 64-byte full-performance hashing loop.
*
* Expects `Msg` and `MsgLen` values (greater than 63), requires initialized
* `Seed1-8` values.
*
* The "shifting" arrangement of `Seed1-4` XORs (below) does not increase
* individual `SeedN` PRNG period beyond 2^64, but reduces a chance of any
* occassional synchronization between PRNG lanes happening. Practically,
* `Seed1-4` together become a single "fused" 256-bit PRNG value, having 2^66
* summary PRNG period.
*/
( run in 0.595 second using v1.01-cache-2.11-cpan-49f99fa48dc )