コンパイル時に文字列のハッシュを実行できますか?
C 11 では、コンパイル時に文字列のハッシュを計算する実現可能性に関して憶測が生じました。新しい文字列リテラルを使用します。
演算子構文
コンパイル時の文字列ハッシュを実行するための演算子の構文の詳細は不明のままです。ユースケースを紹介する提案されたコード サンプルでは、この演算子が以下に示す架空の「std::hash(value)」に似ている可能性があることが示唆されています。
void foo(const std::string& value) { switch( std::hash(value) ) { case "one"_hash: one(); break; case "two"_hash: two(); break; /*many more cases*/ default: other(); break; } }
実装の課題
見かけの switch ステートメントにもかかわらず、実装には克服すべきハードルがあります。 C 11 の定数文字列は const char* であり、std::strings ではありません。これには追加の変換手順が必要となり、効率が妨げられる可能性があります。
実装の成功
constexpr を使用してコンパイル時 CRC32 関数の画期的な実装が実現されましたが、これは GCC に限定されています。現在のコンパイラ。この実装では、CRC32 テーブルと再帰的な constexpr 関数を活用してハッシュを計算します。
constexpr uint32_t crc32(const char * str, size_t idx = 0) { return (crc32(str, idx-1) >> 8) ^ crc_table[(crc32(str, idx-1) ^ str[idx]) & 0x000000FF]; } constexpr uint32_t crc32(const char * str, size_t(-1)) { return 0xFFFFFFFF; } #define COMPILE_TIME_CRC32_STR(x) (crc32(x) ^ 0xFFFFFFFF)
この実装を使用すると、次のように文字列のコンパイル時の CRC32 ハッシュを計算できます。
enum TestEnum { CrcVal01 = COMPILE_TIME_CRC32_STR("stack-overflow"), };
これは値 0x335CC04A を CrcVal01 に割り当て、実際のアプリケーションを示しています。コンパイル時の文字列ハッシュ。
以上がC のコンパイル時の文字列ハッシュは効率的に実行できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。