4

C++17 string_viewのstd::hash 関数は constexpr のものではないようです。

const char[] にバインドされた文字列ビューは、コンパイル時にハッシュされる可能性があるように思えます (これは非常に便利です)、またはこれを妨げるものはありますか?

4

1 に答える 1

10

C++14 以降 (17.6.3.4 ハッシュ要件、表 26 を参照)、次のようになりました。

返される値は、プログラムの実行中は引数 k のみに依存します。[注: したがって、k の値が同じである式 h(k) のすべての評価は、プログラムの特定の実行に対して同じ結果をもたらします。-- 終了注]

2 つの異なる実行により、異なるハッシュが得られる可能性があります

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

この動作は、ハッシュ衝突ベースの DoS 攻撃を軽減するのに役立ちます。

詳細

HashC++17 標準からの概念の要件に関する文言は次のとおりです。

返される値は、プログラムの実行中は引数 k のみに依存します 。[ 注: したがって、k の値が同じである式 h(k) のすべての評価は、プログラムの特定の実行に対して同じ結果をもたらします。— エンドノート]

ランダムハッシュについては何も明示的に述べていません。std::hashテキストは義務付けておらず、ランダムハッシュを排除していません。

歴史

N3242 2011-02-28 ドラフトでは、「プログラムの期間中」について言及されていません

例外をスローしません。返される値は、引数 k のみに依存します。[注: したがって、k の値が同じである式 h(k) のすべての評価は、同じ結果をもたらします。— エンドノート

「 2291.std::hashは衝突 DoS 攻撃に対して脆弱である」の解決策として、「プログラムの継続時間中」「プログラムの特定の実行中」の追加が追加されていることがわかります。

実際には

AFAIU、の実装はstd::hashランダムハッシュを実装していませんが、独自のmy::secure_hash.

于 2016-06-20T07:53:59.513 に答える