Changeset: 5d5b515419e0 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=5d5b515419e0
Modified Files:
        gdk/gdk_hash.h
Branch: Jul2017
Log Message:

Better hash functions for 64 and 128 bit integers.
The main problem with the old version is that it works very badly if
you use a trick to combine multiple 32 bit values in a single 64 or
128 bit value.


diffs (38 lines):

diff --git a/gdk/gdk_hash.h b/gdk/gdk_hash.h
--- a/gdk/gdk_hash.h
+++ b/gdk/gdk_hash.h
@@ -134,10 +134,31 @@ gdk_export BUN HASHlist(Hash *h, BUN i);
                         ((unsigned int) (X) >> 13) ^   \
                         ((unsigned int) (X) >> 21) ^   \
                         (unsigned int) (X))
-#define mix_lng(X)     mix_int((unsigned int) ((ulng) (X) ^            \
-                                               ((ulng) (X) >> 32)))
+#define mix_lng(X)     (((ulng) (X) >> 7) ^    \
+                        ((ulng) (X) >> 13) ^   \
+                        ((ulng) (X) >> 21) ^   \
+                        ((ulng) (X) >> 31) ^   \
+                        ((ulng) (X) >> 38) ^   \
+                        ((ulng) (X) >> 46) ^   \
+                        ((ulng) (X) >> 56) ^   \
+                        (ulng) (X))
 #ifdef HAVE_HGE
-#define mix_hge(X)     mix_lng((ulng) ((uhge) (X) ^ ((uhge) (X) >> 64)))
+#define mix_hge(X)     (((uhge) (X) >> 7) ^    \
+                        ((uhge) (X) >> 13) ^   \
+                        ((uhge) (X) >> 21) ^   \
+                        ((uhge) (X) >> 31) ^   \
+                        ((uhge) (X) >> 38) ^   \
+                        ((uhge) (X) >> 46) ^   \
+                        ((uhge) (X) >> 56) ^   \
+                        ((uhge) (X) >> 65) ^   \
+                        ((uhge) (X) >> 70) ^   \
+                        ((uhge) (X) >> 78) ^   \
+                        ((uhge) (X) >> 85) ^   \
+                        ((uhge) (X) >> 90) ^   \
+                        ((uhge) (X) >> 98) ^   \
+                        ((uhge) (X) >> 107) ^  \
+                        ((uhge) (X) >> 116) ^  \
+                        (uhge) (X))
 #endif
 #define hash_loc(H,V)  hash_any(H,V)
 #define hash_var(H,V)  hash_any(H,V)
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to