首頁 > 後端開發 > C++ > C編譯時字串雜湊能否高效實現?

C編譯時字串雜湊能否高效實現?

Susan Sarandon
發布: 2024-12-02 22:42:10
原創
595 人瀏覽過

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板