Fix: stale dnode caching instance cause locked-up upon accessing (#52)
[lunaix-os.git] / lunaix-os / libs / hash.c
index 293ec67bc3bddb6d7a450e09e32009c5f827f4e3..7182ab684523b1fa53180c336f9e0f0a17be23ba 100644 (file)
@@ -1,21 +1,28 @@
-#include <lib/hash.h>
+#include <klibc/hash.h>
+#include <lunaix/compiler.h>
 
 /**
 
 /**
- * @brief Simple string hash function
+ * @brief Simple string hash function (sdbm)
  *
  *
- * ref: https://stackoverflow.com/a/7666577
+ * ref: http://www.cse.yorku.ca/~oz/hash.html
+ * 
+ * sdbm has lower standard deviation in bucket distribution
+ * than djb2 (previously used) for low bucket size (16, 32).
  *
  * @param str
  * @return unsigned int
  */
  *
  * @param str
  * @return unsigned int
  */
-uint32_t
-strhash_32(unsigned char* str, uint32_t truncate_to)
+u32_t _weak
+strhash_32(const char* str, u32_t truncate_to)
 {
 {
-    uint32_t hash = 5381;
+    if (!str)
+        return 0;
+
+    u32_t hash = 0;
     int c;
 
     int c;
 
-    while (c = *str++)
-        hash = ((hash << 5) + hash) + c; /* hash * 33 + c */
+    while ((c = *str++))
+        hash = (hash << 6) + (hash << 16) + c - hash;
 
     return hash >> (HASH_SIZE_BITS - truncate_to);
 }
\ No newline at end of file
 
     return hash >> (HASH_SIZE_BITS - truncate_to);
 }
\ No newline at end of file