diff --git a/benchmark/string.cpp b/benchmark/string.cpp index 898bbf5a..86784a08 100644 --- a/benchmark/string.cpp +++ b/benchmark/string.cpp @@ -234,12 +234,62 @@ template using multi_index_map = multi_index_container< > >; +// fnv1a_hash + +template struct fnv1a_hash_impl; + +template<> struct fnv1a_hash_impl<32> +{ + std::size_t operator()( std::string const& s ) const + { + std::size_t h = 0x811C9DC5u; + + char const * first = s.data(); + char const * last = first + s.size(); + + for( ; first != last; ++first ) + { + h ^= static_cast( *first ); + h *= 0x01000193ul; + } + + return h; + } +}; + +template<> struct fnv1a_hash_impl<64> +{ + std::size_t operator()( std::string const& s ) const + { + std::size_t h = 0xCBF29CE484222325ull; + + char const * first = s.data(); + char const * last = first + s.size(); + + for( ; first != last; ++first ) + { + h ^= static_cast( *first ); + h *= 0x00000100000001B3ull; + } + + return h; + } +}; + +struct fnv1a_hash: fnv1a_hash_impl< std::numeric_limits::digits > {}; + +template using boost_unordered_map_fnv1a = + boost::unordered_map; + +// + int main() { init_indices(); test( "std::unordered_map" ); test( "boost::unordered_map" ); + test( "boost::unordered_map, FNV-1a" ); test( "multi_index_map" ); // test( "std::map" );