diff --git a/source/kernel/gen_system/GEN_HashedPtr.cpp b/source/kernel/gen_system/GEN_HashedPtr.cpp
index f852530fa5352cee2b4972b578dacc3456a12ac8..4da40e6696d55a50aef95d12fcc5544267cab1fa 100644
--- a/source/kernel/gen_system/GEN_HashedPtr.cpp
+++ b/source/kernel/gen_system/GEN_HashedPtr.cpp
@@ -36,9 +36,19 @@
 #include <config.h>
 #endif
 
-unsigned int GEN_Hash(unsigned int inDWord)
+//
+// Build hash index from pointer.  Even though the final result
+// is a 32-bit integer, use all the bits of the pointer as long
+// as possible.
+//
+
+unsigned int GEN_Hash(void * inDWord)
 {
-	unsigned int key = inDWord;
+#if defined(_WIN64)
+	unsigned __int64 key = (unsigned __int64)inDWord;
+#else
+	unsigned long key = (unsigned long)inDWord;
+#endif
 
 	key += ~(key << 16);
 	key ^=  (key >>  5);
@@ -47,5 +57,5 @@ unsigned int GEN_Hash(unsigned int inDWord)
 	key += ~(key <<  9);
 	key ^=  (key >> 17);
 
-  	return key;
+  	return (unsigned int)(key & 0xffffffff);
 }