Move the SpookyHash libraries into folly/hash
[folly.git] / folly / Hash.h
index c3593c3cf6edd08035a5fd4eef02ee631c1957c3..e8b75df377972be27b4673679c96fb18e7534061 100644 (file)
@@ -214,6 +214,7 @@ inline uint32_t jenkins_rev_unmix32(uint32_t key) {
 
 const uint32_t FNV_32_HASH_START = 2166136261UL;
 const uint64_t FNV_64_HASH_START = 14695981039346656037ULL;
+const uint64_t FNVA_64_HASH_START = 14695981039346656037ULL;
 
 inline uint32_t fnv32(const char* buf, uint32_t hash = FNV_32_HASH_START) {
   // forcing signed char, since other platforms can use unsigned
@@ -278,6 +279,24 @@ inline uint64_t fnv64(const std::string& str,
   return fnv64_buf(str.data(), str.size(), hash);
 }
 
+inline uint64_t fnva64_buf(const void* buf,
+                           size_t n,
+                           uint64_t hash = FNVA_64_HASH_START) {
+  const uint8_t* char_buf = reinterpret_cast<const uint8_t*>(buf);
+
+  for (size_t i = 0; i < n; ++i) {
+    hash ^= char_buf[i];
+    hash += (hash << 1) + (hash << 4) + (hash << 5) + (hash << 7) +
+            (hash << 8) + (hash << 40);
+  }
+  return hash;
+}
+
+inline uint64_t fnva64(const std::string& str,
+                       uint64_t hash = FNVA_64_HASH_START) {
+  return fnva64_buf(str.data(), str.size(), hash);
+}
+
 /*
  * Paul Hsieh: http://www.azillionmonkeys.com/qed/hash.html
  */