いいえ、実際のところは誰にもわかりません。実装ごとに異なる可能性があります。主な要件は次のとおりです (N3092、§20.8.15):
特殊化ハッシュが存在するすべてのオブジェクト タイプ キーの場合、インスタンス化ハッシュは次のようになります。
- ハッシュ要件 (20.2.4) を満たし、Key を関数呼び出しの引数の型として使用し、DefaultConstructible 要件 (33)、CopyAssignable 要件 (37)、
- 左辺値のスワップ可能 (20.2.2)、
- それぞれ size_t と Key の同義語となる 2 つのネストされた型 result_type と argument_type を提供します。
- k1 == k2 が true の場合、h(k1) == h(k2) も true であるという要件を満たします。ここで、h は hash 型のオブジェクトであり、k1 と k2 は Key 型のオブジェクトです。
および (N3092、§20.2.4):
タイプ H は、次の場合にハッシュ要件を満たします。
- 関数オブジェクト型 (20.8) です。
- CopyConstructible および Destructible (20.2.1) の要件を満たします。
- 次の表に示す式が有効であり、示されたセマンティクスを持っている。
- それは、この節の他のすべての要件を満たしています。
§20.8.15 はハッシュの結果に関する要件をカバーし、§20.2.4 はハッシュ自体に関する要件をカバーしています。ただし、ご覧のとおり、どちらもかなり一般的です。言及されている表は、基本的にさらに 3 つの要件をカバーしています。
- ハッシュ関数は「純粋」でなければなりません (つまり、結果は入力のみに依存し、コンテキストや履歴などには依存しません)。
- 関数は、渡された引数を変更してはなりません。
- 例外をスローしてはなりません。
ただし、正確なアルゴリズムは明確に指定されていません。長さにもかかわらず、上記の要件のほとんどは、(少なくとも私には) かなり明白に見える要件を述べているだけです。要するに、実装は、ほぼどのような方法でもハッシュを自由に実装できます。