以降、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
)はすべて確定的です。効率の問題はありますか?