18 #ifndef LIBMESH_HASHWORD_H 19 #define LIBMESH_HASHWORD_H 47 uint32_t rot(uint32_t x, uint32_t k)
49 return (x<<k) | (x>>(32-k));
63 void mix(uint32_t & a, uint32_t & b, uint32_t & c)
65 a -= c; a ^= rot(c, 4); c += b;
66 b -= a; b ^= rot(a, 6); a += c;
67 c -= b; c ^= rot(b, 8); b += a;
68 a -= c; a ^= rot(c,16); c += b;
69 b -= a; b ^= rot(a,19); a += c;
70 c -= b; c ^= rot(b, 4); b += a;
83 void final_mix(uint32_t & a, uint32_t & b, uint32_t & c)
85 c ^= b; c -= rot(b,14);
86 a ^= c; a -= rot(c,11);
87 b ^= a; b -= rot(a,25);
88 c ^= b; c -= rot(b,16);
89 a ^= c; a -= rot(c,4);
90 b ^= a; b -= rot(a,14);
91 c ^= b; c -= rot(b,24);
109 uint64_t fnv_64_buf(
const void * buf,
size_t len)
112 uint64_t hval =
static_cast<uint64_t
>(0xcbf29ce484222325ULL);
115 const unsigned char * bp =
static_cast<const unsigned char *
>(buf);
118 const unsigned char * be = bp + len;
129 (hval << 1) + (hval << 4) + (hval << 5) +
130 (hval << 7) + (hval << 8) + (hval << 40);
133 hval ^=
static_cast<uint64_t
>(*bp++);
158 uint32_t
hashword(
const uint32_t * k,
size_t length, uint32_t initval=0)
163 a = b = c = 0xdeadbeef + ((
static_cast<uint32_t
>(length))<<2) + initval;
180 libmesh_fallthrough();
182 libmesh_fallthrough();
185 libmesh_fallthrough();
200 uint32_t
hashword(
const std::vector<uint32_t> & keys, uint32_t initval=0)
202 return hashword(keys.data(), keys.size(), initval);
215 uint32_t
hashword2(
const uint32_t & first,
const uint32_t & second, uint32_t initval=0)
220 a = b = c = 0xdeadbeef + 8 + initval;
238 uint64_t
hashword2(
const uint64_t first,
const uint64_t second)
241 uint64_t hval =
static_cast<uint64_t
>(0xcbf29ce484222325ULL);
243 for (
int i=0; i!=2; ++i)
247 auto beg =
reinterpret_cast<const unsigned char *
>(i==0 ? &first : &second);
248 auto end = beg +
sizeof(uint64_t)/
sizeof(
unsigned char);
254 (hval << 1) + (hval << 4) + (hval << 5) +
255 (hval << 7) + (hval << 8) + (hval << 40);
258 hval ^=
static_cast<uint64_t
>(*beg++);
266 uint16_t
hashword2(
const uint16_t first,
const uint16_t second)
268 return static_cast<uint16_t
>(first%65449 + (second<<5)%65449);
275 uint64_t
hashword(
const uint64_t * k,
size_t length)
277 return fnv_64_buf(k, 8*length);
289 uint16_t
hashword(
const uint16_t * k,
size_t length)
310 a = ((k[0]<<16) | (k[1] & 0xffff));
311 b = ((k[2]<<16) | (k[3] & 0xffff));
315 libmesh_error_msg(
"Unsupported length: " << length);
320 return static_cast<uint16_t
>(c);
328 template <
typename Container>
330 typename Container::value_type
hashword(
const Container & keys)
332 return hashword(keys.data(), keys.size());
340 #endif // LIBMESH_HASHWORD_H The libMesh namespace provides an interface to certain functionality in the library.
uint32_t hashword(const uint32_t *k, size_t length, uint32_t initval=0)
The hashword function takes an array of uint32_t's of length 'length' and computes a single key from ...
uint32_t hashword2(const uint32_t &first, const uint32_t &second, uint32_t initval=0)
This is a hard-coded version of hashword for hashing exactly 2 numbers.