13 #include "gu_byteswap.hpp"
14 #include "gu_serializable.hpp"
15 #include "gu_macros.hpp"
26 MMH3 () : ctx_() { gu_mmh128_init (&ctx_); }
30 template <
typename T>
static int
31 digest (
const void*
const in,
size_t size, T& out)
34 gu_mmh128(in, size, tmp);
35 int const s(std::min(
sizeof(T),
sizeof(tmp)));
36 ::memcpy (&out, tmp, s);
41 template <
typename T>
static T
42 digest (
const void*
const in,
size_t size)
46 case 1:
return gu_mmh128_32(in, size);
47 case 2:
return gu_mmh128_32(in, size);
48 case 4:
return gu_mmh128_32(in, size);
49 case 8:
return gu_mmh128_64(in, size);
54 void append (
const void*
const buf,
size_t const size)
56 gu_mmh128_append (&ctx_, buf, size);
59 template <
size_t size>
60 int gather (
void*
const buf)
const
62 GU_COMPILE_ASSERT(size >= 16, wrong_buf_size);
67 int gather (
void*
const buf,
size_t const size)
const
71 int const s(std::min(size,
sizeof(tmp)));
72 ::memcpy (buf, tmp, s);
76 void gather16 (
void*
const buf)
const { gu_mmh128_get (&ctx_, buf); }
78 uint64_t gather8()
const {
return gu_mmh128_get64 (&ctx_); }
80 uint32_t gather4()
const {
return gu_mmh128_get32 (&ctx_); }
83 template <
typename T>
int
84 operator() (T& out)
const {
return gather<sizeof(out)>(&out); }
92 template <>
inline int
93 MMH3::digest (
const void*
const in,
size_t size, uint8_t& out)
95 out = gu_mmh128_32(in, size);
return sizeof(out);
98 template <>
inline int
99 MMH3::digest (
const void*
const in,
size_t size, uint16_t& out)
101 out = gu_mmh128_32(in, size);
return sizeof(out);
104 template <>
inline int
105 MMH3::digest (
const void*
const in,
size_t size, uint32_t& out)
107 out = gu_mmh128_32(in, size);
return sizeof(out);
110 template <>
inline int
111 MMH3::digest (
const void*
const in,
size_t size, uint64_t& out)
113 out = gu_mmh128_64(in, size);
return sizeof(out);
116 template <>
inline int
117 MMH3::gather<8> (
void*
const out)
const
119 *(
reinterpret_cast<uint64_t*
>(out)) = htog64(gather8());
return 8;
122 template <>
inline int
123 MMH3::gather<4> (
void*
const out)
const
125 *(
reinterpret_cast<uint32_t*
>(out)) = htog32(gather4());
return 4;
135 template <
typename T>
static int
136 digest (
const void*
const in,
size_t size, T& out)
139 gu_fast_hash128(in, size, tmp);
140 int const s(std::min(
sizeof(T),
sizeof(tmp)));
141 ::memcpy (&out, tmp, s);
146 template <
typename T>
static T
147 digest (
const void*
const in,
size_t size)
151 case 1:
return gu_fast_hash32(in, size);
152 case 2:
return gu_fast_hash32(in, size);
153 case 4:
return gu_fast_hash32(in, size);
154 case 8:
return gu_fast_hash64(in, size);
160 template <>
inline int
161 FastHash::digest (
const void*
const in,
size_t size, uint8_t& out)
163 out = gu_fast_hash32(in, size);
return sizeof(out);
166 template <>
inline int
167 FastHash::digest (
const void*
const in,
size_t size, uint16_t& out)
169 out = gu_fast_hash32(in, size);
return sizeof(out);
172 template <>
inline int
173 FastHash::digest (
const void*
const in,
size_t size, uint32_t& out)
175 out = gu_fast_hash32(in, size);
return sizeof(out);
178 template <>
inline int
179 FastHash::digest (
const void*
const in,
size_t size, uint64_t& out)
181 out = gu_fast_hash64(in, size);
return sizeof(out);
Definition: gu_digest.hpp:22
Definition: gu_digest.hpp:131
Definition: gu_mmh3.h:276