std :: hashが確定的であることが保証されていないのはなぜですか?


28

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


7
「...ハッシュ関数は、プログラムの1回の実行で同じ入力に対して同じ結果を生成するためにのみ必要です。これにより、ソルトハッシュにより、衝突によるサービス拒否攻撃を防ぐことができます。」出典:en.cppreference.com/w/cpp/utility/hash
Richard Critten

5
これにより、確定的アルゴリズムが非確定的入力を受け取ることができます。たとえば、ポインタ値。不変のデータ構造では、内部データのアドレスをハッシュできます。これは、コンテンツをハッシュするよりもはるかに高速です。
John Kugelman

4
この回答には、決定論を望まない理由について、いくつかの素晴らしいリンクがあります。
NathanOliver

3
これを制限として脅かすのではなく、標準の制約を少し厳しくしないでください。
マレクR

4
ここで、なぜ十分な説明制約が緩められています。
Marek R

回答:


17

実行間でハッシュ関数が確定的である必要はありませんが、独自のハッシュを提供することができます。たとえば、それが依存する動作である場合は、順序付けされていないコンテナーに使用できます。

理由については、cppreferenceは次のように述べています。

ハッシュ関数は、プログラムの1回の実行で同じ入力に対して同じ結果を生成するためにのみ必要です。これにより、衝突によるサービス拒否攻撃を防ぐソルトハッシュが可能になります。

Hash要件によって確定的であることが示されている場合、要件を破らずにソルトハッシュを提供することはできません。

これが実際の理由です


7

@NathanOliverによって提案されたこの回答(およびその中のリンク)は、最終的に役立ちます。重要な部分を引用させてください。

暗号化されていないハッシュ関数の場合、同じハッシュ値で大量の入力を事前に計算して、順序付けされていないコンテナーをアルゴリズムによって遅くし、サービス拒否攻撃を引き起こす可能性があります。

問題2291より。std:: hashは衝突DoS攻撃に対して脆弱です

このため、言語設計者はランダムハッシュに移行しています。ランダムハッシュでは、文字列「a」のハッシュ値は、プログラムを実行するたびに変わる可能性があります。Python(バージョン3.3以降)、Ruby(バージョン1.9以降)、およびPerl(バージョン5.18以降)では、ランダムハッシュがデフォルトになりました。

ランダムなハッシュを使用していることに気付いていますか?

リフレクターのディスカッションで許可さえ争われているため、即時ではなく準備完了に移動する

問題2291より。std:: hashは衝突DoS攻撃に対して脆弱です

実際には、私が理解している限り、の実装はstd::hashランダムハッシュを実装していませんが、独自のを作成できますmy::secure_hash

この回答から)


PS

私は「ハッシュテーブルdos」をググっただけで、有益なページを見つけました。世界中のすべてのサーバーが脆弱であることに気づいた瞬間です

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.