以降、N4140(C ++ 14 Standard)を使用します。
§17.6.3.4ハッシュ要件によると、
返される値
kは、プログラム期間中の引数にのみ依存します。[注:したがって
h(k)、の同じ値を持つ 式のすべての評価は、プログラムの特定の実行に対してk同じ結果になります。—エンドノート]
および§20.9.12クラステンプレートハッシュは言う
...
インスタンス化
hash<Key>は:(1.1)—ハッシュ要件を満たす(17.6.3.4)...
(1.2)— ...
これは、プログラムを再起動した場合value(つまりhash<decltype(value)>(value))のハッシュ値が別の値になる場合があることを意味します。
しかし、なぜ?この制限は、C ++ 11の標準ではなく、C ++ 14、C ++ 17、およびC ++ 20の標準にありました。ユーザー(STL開発者ではない)として、std::hash決定論的である場合は非常に便利です。確定的ハッシュ関数の実装に数学的な困難はありますか?しかし、私たちが日常的に使用しているハッシュ関数(たとえば、非推奨md5sumまたはより安全sha256)はすべて確定的です。効率の問題はありますか?