43 #if defined(_M_X64) && !defined(_M_ARM64EC)
44 #pragma intrinsic(_umul128)
54 #define RAPIDHASH_NOEXCEPT noexcept
55 #define RAPIDHASH_CONSTEXPR constexpr
56 #ifndef RAPIDHASH_INLINE
57 #define RAPIDHASH_INLINE inline
60 #define RAPIDHASH_NOEXCEPT
61 #define RAPIDHASH_CONSTEXPR static const
62 #ifndef RAPIDHASH_INLINE
63 #define RAPIDHASH_INLINE static inline
73 #ifndef RAPIDHASH_PROTECTED
74 #define RAPIDHASH_FAST
75 #elif defined(RAPIDHASH_FAST)
76 #error "cannot define RAPIDHASH_PROTECTED and RAPIDHASH_FAST simultaneously."
89 #ifndef RAPIDHASH_COMPACT
90 #define RAPIDHASH_UNROLLED
91 #elif defined(RAPIDHASH_UNROLLED)
92 #error "cannot define RAPIDHASH_COMPACT and RAPIDHASH_UNROLLED simultaneously."
98 #if defined(__GNUC__) || defined(__INTEL_COMPILER) || defined(__clang__)
99 #define _likely_(x) __builtin_expect(x,1)
100 #define _unlikely_(x) __builtin_expect(x,0)
102 #define _likely_(x) (x)
103 #define _unlikely_(x) (x)
109 #ifndef RAPIDHASH_LITTLE_ENDIAN
110 #if defined(_WIN32) || defined(__LITTLE_ENDIAN__) || (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
111 #define RAPIDHASH_LITTLE_ENDIAN
112 #elif defined(__BIG_ENDIAN__) || (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
113 #define RAPIDHASH_BIG_ENDIAN
115 #warning "could not determine endianness! Falling back to little endian."
116 #define RAPIDHASH_LITTLE_ENDIAN
123 #define RAPID_SEED (0xbdd89aa982704029ull)
147 #if defined(__SIZEOF_INT128__)
148 __uint128_t r=*A; r*=*B;
149 #ifdef RAPIDHASH_PROTECTED
154 #elif defined(_MSC_VER) && (defined(_WIN64) || defined(_M_HYBRID_CHPE_ARM64))
156 #ifdef RAPIDHASH_PROTECTED
158 a=_umul128(*A,*B,&b);
161 *A=_umul128(*A,*B,B);
164 #ifdef RAPIDHASH_PROTECTED
176 uint64_t ha=*A>>32, hb=*B>>32, la=(uint32_t)*A, lb=(uint32_t)*B, hi, lo;
177 uint64_t rh=ha*hb, rm0=ha*lb, rm1=hb*la, rl=la*lb, t=rl+(rm0<<32), c=t<rl;
178 lo=t+(rm1<<32); c+=lo<t; hi=rh+(rm0>>32)+(rm1>>32)+c;
179 #ifdef RAPIDHASH_PROTECTED
201 #ifdef RAPIDHASH_LITTLE_ENDIAN
204 #elif defined(__GNUC__) || defined(__INTEL_COMPILER) || defined(__clang__)
207 #elif defined(_MSC_VER)
213 return (((v >> 56) & 0xff)| ((v >> 40) & 0xff00)| ((v >> 24) & 0xff0000)| ((v >> 8) & 0xff000000)| ((v << 8) & 0xff00000000)| ((v << 24) & 0xff0000000000)| ((v << 40) & 0xff000000000000)| ((v << 56) & 0xff00000000000000));
216 uint32_t v; memcpy(&v, p, 4);
217 return (((v >> 24) & 0xff)| ((v >> 8) & 0xff00)| ((v << 8) & 0xff0000)| ((v << 24) & 0xff000000));
245 const uint8_t *p=(
const uint8_t *)key; seed^=
rapid_mix(seed^secret[0],secret[1])^len;
uint64_t a, b;
248 const uint8_t * plast = p + len - 4;
250 const uint64_t delta = ((len&24)>>(len>>3));
259 #ifdef RAPIDHASH_UNROLLED
293 return rapid_mix(a^secret[0]^len,b^secret[1]);
#define RAPIDHASH_CONSTEXPR
RAPIDHASH_INLINE uint64_t rapid_readSmall(const uint8_t *p, size_t k) RAPIDHASH_NOEXCEPT
RAPIDHASH_INLINE uint64_t rapid_read64(const uint8_t *p) RAPIDHASH_NOEXCEPT
RAPIDHASH_INLINE uint64_t rapidhash_internal(const void *key, size_t len, uint64_t seed, const uint64_t *secret) RAPIDHASH_NOEXCEPT
RAPIDHASH_INLINE uint64_t rapid_mix(uint64_t A, uint64_t B) RAPIDHASH_NOEXCEPT
#define RAPIDHASH_NOEXCEPT
RAPIDHASH_INLINE uint64_t rapid_read32(const uint8_t *p) RAPIDHASH_NOEXCEPT
RAPIDHASH_INLINE void rapid_mum(uint64_t *A, uint64_t *B) RAPIDHASH_NOEXCEPT
RAPIDHASH_INLINE uint64_t rapidhash(const void *key, size_t len) RAPIDHASH_NOEXCEPT
RAPIDHASH_CONSTEXPR uint64_t rapid_secret[3]
RAPIDHASH_INLINE uint64_t rapidhash_withSeed(const void *key, size_t len, uint64_t seed) RAPIDHASH_NOEXCEPT
unsigned long long uint64_t