ホームページ > バックエンド開発 > C++ > C のコンパイル時の文字列ハッシュは効率的に実行できますか?

C のコンパイル時の文字列ハッシュは効率的に実行できますか?

Susan Sarandon
リリース: 2024-12-02 22:42:10
オリジナル
552 人が閲覧しました

Can C   Compile-Time String Hashing Be Achieved Efficiently?

コンパイル時に文字列のハッシュを実行できますか?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート