正確なハッシュ アルゴリズムは標準で指定されていないため、結果は異なります。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 ;
}
};
メルセンヌ素数ハッシュ:
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 を掛けるよりも大幅に高速になることが多いため、多くのマシンでは Mersenne 素数ハッシュの方が高速になります。)