Точный алгоритм хеширования не указан стандартом, поэтому результаты могут отличаться.Алгоритм, используемый VC10, похоже, не учитывает все символы, если длина строки превышает 10 символов;оно продвигается с шагом 1 + s.size() / 10
.Это законно, хотя и с точки зрения QoI, довольно обидно;Известно, что такие хэш-коды работают очень плохо для некоторых типичных наборов данных (например, URL).Я настоятельно рекомендую заменить его хешем FNV или хешем на основе простого числа Мерсенна:
хеш FNV:
struct hash
{
size_t operator()( std::string const& s ) const
{
size_t result = 2166136261U ;
std::string::const_iterator end = s.end() ;
for ( std::string::const_iterator iter = s.begin() ;
iter != end ;
++ iter ) {
result = (16777619 * result)
^ static_cast< unsigned char >( *iter ) ;
}
return result ;
}
};
простого хеша Mersenne:
struct hash
{
size_t operator()( std::string const& s ) const
{
size_t result = 2166136261U ;
std::string::const_iterator end = s.end() ;
for ( std::string::const_iterator iter = s.begin() ;
iter != end ;
++ iter ) {
result = 127 * result
+ static_cast< unsigned char >( *iter ) ;
}
return result ;
}
};
(Хеш FNV предположительно лучше, но основной хеш Mersenne будет быстрее на многих машинах, потому что умножение на 127 часто значительно быстрее, чем умножение на 2166136261.)