标准未指定确切的哈希算法,因此结果会有所不同。如果字符串长度超过 10 个字符,VC10 使用的算法似乎并未考虑所有字符;它以 的增量前进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 ;
}
};
梅森素数哈希:
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 散列更好,但梅森素数散列在很多机器上会更快,因为乘以 127 通常比乘以 16777619 快得多。)