|
|
@@ -4,14 +4,29 @@
|
|
|
#include <stdint.h>
|
|
|
#include <stdlib.h>
|
|
|
|
|
|
-typedef char byte_t;
|
|
|
-
|
|
|
__attribute__((access (read_only, 1), nonnull, pure))
|
|
|
-uint64_t hash(const byte_t* data, size_t size);
|
|
|
+uint64_t hash(const uint8_t* data, size_t size);
|
|
|
+
|
|
|
+__attribute__((pure))
|
|
|
+uint64_t uint64_hash(uint64_t key);
|
|
|
|
|
|
#if defined(HASH_IMP) || defined(IMPLEMENTATIONS)
|
|
|
|
|
|
-uint64_t hash(const byte_t* data, size_t size) {
|
|
|
+/* Thomas Wang 64 bit mix hash function. */
|
|
|
+uint64_t
|
|
|
+uint64_hash(uint64_t key)
|
|
|
+{
|
|
|
+ key = (~key) + (key << 21); // key *= (1 << 21) - 1; key -= 1;
|
|
|
+ key = key ^ (key >> 24);
|
|
|
+ key = key + (key << 3) + (key << 8); // key *= 1 + (1 << 3) + (1 << 8)
|
|
|
+ key = key ^ (key >> 14);
|
|
|
+ key = key + (key << 2) + (key << 4); // key *= 1 + (1 << 2) + (1 << 4)
|
|
|
+ key = key ^ (key >> 28);
|
|
|
+ key = key + (key << 31); // key *= 1 + (1 << 31)
|
|
|
+ return key;
|
|
|
+}
|
|
|
+
|
|
|
+uint64_t hash(const uint8_t* data, size_t size) {
|
|
|
static uint8_t _primes_list[] = {
|
|
|
3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59,
|
|
|
61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127,
|