Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Add disk usage and size parameters for storage.
[simgrid.git] / src / xbt / xbt_str.c
index de49953..920df6c 100644 (file)
@@ -6,6 +6,9 @@
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
+#define DJB2_HASH_FUNCTION
+//#define FNV_HASH_FUNCTION
+
 #include "portable.h"
 #include "xbt/misc.h"
 #include "xbt/sysdep.h"
@@ -903,6 +906,87 @@ char *xbt_str_from_file(FILE * file)
   return res;
 }
 
+/**
+ * @brief Returns the hash code of a string.
+ */
+XBT_INLINE unsigned int xbt_dict_hash_ext(const char *str,
+                                                 int str_len)
+{
+
+#ifdef DJB2_HASH_FUNCTION
+  /* fast implementation of djb2 algorithm */
+  int c;
+  register unsigned int hash = 5381;
+
+  while (str_len--) {
+    c = *str++;
+    hash = ((hash << 5) + hash) + c;    /* hash * 33 + c */
+  }
+# elif defined(FNV_HASH_FUNCTION)
+  register unsigned int hash = 0x811c9dc5;
+  unsigned char *bp = (unsigned char *) str;    /* start of buffer */
+  unsigned char *be = bp + str_len;     /* beyond end of buffer */
+
+  while (bp < be) {
+    /* multiply by the 32 bit FNV magic prime mod 2^32 */
+    hash +=
+        (hash << 1) + (hash << 4) + (hash << 7) + (hash << 8) +
+        (hash << 24);
+
+    /* xor the bottom with the current octet */
+    hash ^= (unsigned int) *bp++;
+  }
+
+# else
+  register unsigned int hash = 0;
+
+  while (str_len--) {
+    hash += (*str) * (*str);
+    str++;
+  }
+#endif
+
+  return hash;
+}
+
+/**
+ * @brief Returns the hash code of a string.
+ */
+XBT_INLINE unsigned int xbt_dict_hash(const char *str)
+{
+#ifdef DJB2_HASH_FUNCTION
+  /* fast implementation of djb2 algorithm */
+  int c;
+  register unsigned int hash = 5381;
+
+  while ((c = *str++)) {
+    hash = ((hash << 5) + hash) + c;    /* hash * 33 + c */
+  }
+
+# elif defined(FNV_HASH_FUNCTION)
+  register unsigned int hash = 0x811c9dc5;
+
+  while (*str) {
+    /* multiply by the 32 bit FNV magic prime mod 2^32 */
+    hash +=
+        (hash << 1) + (hash << 4) + (hash << 7) + (hash << 8) +
+        (hash << 24);
+
+    /* xor the bottom with the current byte */
+    hash ^= (unsigned int) *str++;
+  }
+
+# else
+  register unsigned int hash = 0;
+
+  while (*str) {
+    hash += (*str) * (*str);
+    str++;
+  }
+#endif
+  return hash;
+}
+
 #ifdef SIMGRID_TEST
 #include "xbt/str.h"