以降では、使用N4140(C ++ 14標準)。
よると、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の規格ではなかったが、14 ++、C ++ 17とC ++ 20 Cの標準です。場合は、ユーザー(ないSTLの開発者)として、それは非常に有用であろうstd::hash
、確定しました。決定論的ハッシュ関数を実装する際に任意の数学的な難しさはありますか?しかし、使用、我々は毎日ハッシュ関数は、(例えば非推奨md5sum
またはより安全なsha256
)すべての決定論的です。効率の問題はありますか?
そこ実行の間、確定すべきハッシュ関数の必要はありませんが、それはあなたが頼りに行動だ場合、あなたはまだ順不同容器用など、独自のハッシュを提供することができます。
なぜに関しては、cppreferenceは言います:
ハッシュ関数のみプログラムの単一の実行内の同じ入力に対して同じ結果を生成するために必要とされます。これは、衝突サービス拒否攻撃を防ぐ塩漬けハッシュを可能にします。
場合Hash
の要件は、それは決定論的であることを伝え、その後は要件を壊すことなく塩漬けハッシュを提供することができません。
ここで、実際の説明は、なぜ