diff options
Diffstat (limited to 'decoder/hash.h')
-rwxr-xr-x | decoder/hash.h | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/decoder/hash.h b/decoder/hash.h index 3e4ad1ff..3a60a429 100755 --- a/decoder/hash.h +++ b/decoder/hash.h @@ -1,6 +1,8 @@ #ifndef CDEC_HASH_H #define CDEC_HASH_H +#include "murmur_hash.h" + #include "config.h" #ifdef HAVE_SPARSEHASH # include <google/dense_hash_map> @@ -13,7 +15,40 @@ # define HASH_MAP_RESERVED(h,empty,deleted) # define HASH_MAP_EMPTY(h,empty) #endif + #include <boost/functional/hash.hpp> +// assumes C is POD +template <class C> +struct murmur_hash +{ + typedef MurmurInt return_type; + typedef C /*const&*/ argument_type; + return_type operator()(argument_type const& c) const { + return MurmurHash((void*)&c,sizeof(c)); + } +}; + +// murmur_hash_array isn't std guaranteed safe (you need to use string::data()) +template <> +struct murmur_hash<std::string> +{ + typedef MurmurInt return_type; + typedef std::string /*const&*/ argument_type; + return_type operator()(argument_type const& c) const { + return MurmurHash(c.data(),c.size()); + } +}; + +// uses begin(),size() assuming contiguous layout and POD +template <class C> +struct murmur_hash_array +{ + typedef MurmurInt return_type; + typedef C /*const&*/ argument_type; + return_type operator()(argument_type const& c) const { + return MurmurHash(&*c.begin(),c.size()*sizeof(*c.begin())); + } +}; #endif |