問題タブ [stdhash]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - このコードが std::hash テンプレートの **ALL** 列挙型の特殊化を提供するのはなぜですか?
私は C++ のプロではありませんが、MSVS 2015 C++ コードを MinGW 4.9.2 に移植して、std::hash
すべての をサポートするようにクラスを特殊化する際に、何らかの方法で解決策を提供しましたenum
。ここに C++ コンパイラの開発者または C++ プロ プログラマーがいる場合、C++ 標準によると未定義の動作であるにもかかわらず、この特殊化が機能する理由を説明できますか?
のサポートを提供するstd::hash<enum T>
ということは、すべてのクラスstd::unordered_XXX
がキーとして any をサポートすることを意味しenum
ます。
この定義のGCC 6.1.0はstd::hash
エラーで失敗します
この定義のないGCC 5.3.0std::hash
は、std::unordered_set で失敗し、次のエラーが発生します。
c++ - QVariant をハッシュするには?
QList<QVariant>
のキーとして使用する必要がありますstd::unordered_map
。これの目的は、一意のキー列にインデックスを作成することにより、データ テーブルの検索を最適化することです。
だから私はこのコードを作りました。完全ではありませんが、テーブル キー列で発生するいくつかの基本的なデータ型を示します。
明らかに、私はすべてが好きではありませんswitch
。これは非常に長く醜いコードであり、基本的な型しか説明していません。QVariant
の内部データに割り当てられたメモリ データのハッシュを作成したいと思います。または、さらに良い - Qt のハッシュ方法を使用します。
QVariant をプリミティブ型に変換せずにハッシュする半信頼できる*方法はありますか?
*複雑なオブジェクトが QVariant の背後に隠れている可能性があることは理解していますが、これが衝突につながるケースは非常にまれであるため、気にする必要はありません。
c++ - std::unordered_map のキーとして QString を使用する
QString
のキーとして使用しようとしていますstd::unordered_map
が、エラーが発生します:
エラー C2280: 'std::hash<_Kty>::hash(const std::hash<_Kty> &)': 削除された関数を参照しようとしています
QHash
マップの値の型がコピーできないため、切り替えることができません 。これを機能させる方法はありますか?
c++ - 固定サイズのハッシュを生成する
cpp ユーティリティで std::hash を使用して、文字列のハッシュを生成しています。私の要件は、11 桁の固定サイズのハッシュを生成することです。衝突が起こらないようにするために、ハッシュ関数は優れている必要はありません。私が持っている唯一の要件は、11 桁の固定サイズのハッシュを生成することです。どのような入力でも構いません。カスタム ハッシュ関数を使用することもできます。
c++ - std::hash は、異なるコンパイル済みビルドと異なるマシンの同じ入力に対して同じ結果をもたらしますか?
同じパラメーターで実行したかどうかを検出するためにハッシュを計算する必要があるランダムなテストパラメーターがいくつかあります。別の時点で再コンパイルされた同じソースを使用してテストを実行するか、別のマシンで実行する場合があります。
それでも、同じパラメーターが実行に使用されたかどうかを検出したいと考えています。std::hash
異なるコンパイル済みビルドと異なるマシンで同じ入力に対して同じ結果が得られますか?
例えば
これは常に一意の番号になりますか?
c++ - C++ std::hash の戻り値の型
std::hash
そのため、 の使用とその標準実装に関する多くの記事、ドキュメント ページ、投稿、ベンチマークなどを読んできました。
あらすじ
hereを見ると、std::hash
は常に を返すように見えます。これは、実装に依存しますが、ここstd::size_t
から続くサイズは少なくとも16 ビットまたは 2 バイトです。
しかし、これは私に関係があります。std::hash
ハッシュが少なくとも32ビットになるという保証さえできない場合(そして、64ビットを返すことを本当に望んでいます)、文字列でどのように使用できますか。
私の特定の x64 マシンstd::size_t
では が として定義されてlong unsigned int
いますが、プログラムを展開するときにこれが保証されていないようです。
質問
これを回避する方法はありstd::hash
ますか?
結論
コメントから判断すると、std::hash
適切ではありません。ありがとう!