正確なハッシュアルゴリズムは標準では指定されていないため、結果は です。文字列が10文字より長い場合、VC10で使用されるアルゴリズムは、 文字をすべて考慮していないようです。 は、インクリメントが1 + s.size()/10
になります。これは合法ですが、QoIの観点からではありますが、むしろ失望していますが です。そのようなハッシュコード は、いくつかの典型的なデータセット(例えば、 のURL)に対して非常に不十分に機能することが知られています。私は強くあなたが総理メルセンヌに基づいてFNVハッシュまたは 1のいずれかでそれを置き換えることをお勧めしたい:
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ハッシュはおそらくより良いと思われますが、Mersenneのプライムハッシュは、多くのマシンでは の方が速くなります。なぜなら127を掛けるほうが、しばしば を2166136261で乗算するよりも速くなるからです。
コンパイラとバージョンは何ですか? – Joe
@Joe私はMSVC10を使用しています – relaxxx
@relaxxx:MSVC10はおそらく完全なC++ 11の実装を提供する最後のものです。あなたが実用的な実装を望むなら、最も完全な実装はclangです。より一般的なgccを試すこともできます。 – Dani