#define MSP_CORE_HASH_H_
#include <string>
+#include "inttypes.h"
namespace Msp {
-#ifdef MSVC
-typedef __uint64 HashValue64;
-#else
-typedef unsigned long long HashValue64;
-#endif
-
/**
Computes a 32-bit Fowler-Noll-Vo (FNV-1a) hash. The number of bits can be
limited to less than 32, in which case XOR-folding is used to reduce the hash
size.
*/
-unsigned hash32(const void *, unsigned, unsigned = 32);
+UInt32 hash32(const void *, unsigned, unsigned = 32);
/**
Convenience function to compute a 32-bit hash of a string.
Computes a 64-bit Fowler-Noll-Vo (FNV-1a) hash. Note that even if bits is
limited to 32 or less, this does not produce the same result as hash32.
*/
-HashValue64 hash64(const void *, unsigned, unsigned = 64);
+UInt64 hash64(const void *, unsigned, unsigned = 64);
/**
Convenience function to compute a 64-bit hash of a string.
*/
-inline HashValue64 hash64(const std::string &s, unsigned b = 64)
+inline UInt64 hash64(const std::string &s, unsigned b = 64)
{ return hash64(s.data(), s.size(), b); }
+inline UInt32 fold32(UInt64 hash)
+{ return hash^(hash>>32); }
+
+inline UInt16 fold16(UInt64 hash)
+{ return hash^(hash>>16)^(hash>>32)^(hash>>48); }
+
} // namespace Msp
#endif