Răsfoiți Sursa

[hash.h] Adding uint64_t hash function

Vinicius Teshima 1 an în urmă
părinte
comite
ba74b611c0
1 a modificat fișierele cu 19 adăugiri și 4 ștergeri
  1. 19 4
      include/toolbox/hash.h

+ 19 - 4
include/toolbox/hash.h

@@ -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,