首頁 > 後端開發 > C++ > C 11 字串文字可以用於編譯時字串雜湊嗎?

C 11 字串文字可以用於編譯時字串雜湊嗎?

Linda Hamilton
發布: 2024-12-03 03:17:10
原創
710 人瀏覽過

Can C  11 String Literals Be Used for Compile-Time String Hashing?

使用C 11 字串文字進行編譯時字串雜湊

問題:

問題:

是嗎可以使用C 11 的新字串在編譯時計算字串的雜湊值文字?

答案:

是的,這是可能的,但需要謹慎,因為它可能不適用於所有編譯器。

運算子:

編譯時字串雜湊的運算子未明確定義。相反,使用以字串文字作為輸入的編譯時雜湊函數產生常數表達式。

用例:
void foo(const std::string& value)
{
   switch(std::hash<value>())
   {
      case "one"_hash: one(); break;
      case "two"_hash: two(); break;
      default: other(); break;
   }
}
登入後複製

一個潛在的用例是建立可以根據字串的雜湊執行不同操作的switch 語句:

範例實作:
template<size_t idx>
constexpr uint32_t crc32(const char * str)
{
    // Compile-time CRC32 implementation
    return (crc32<idx-1>(str) >> 8) ^ crc_table[(crc32<idx-1>(str) ^ str[idx]) & 0x000000FF];
}

template<>
constexpr uint32_t crc32<size_t(-1)>(const char * str)
{
    // Stop recursion
    return 0xFFFFFFFF;
}

#define COMPILE_TIME_CRC32_STR(x) (crc32<sizeof(x) - 2>(x) ^ 0xFFFFFFFF)
登入後複製

這是使用constexpr函數的範例實作:
enum TestEnum
{
    CrcVal01 = COMPILE_TIME_CRC32_STR("stack-overflow"),
};
登入後複製

可以如下使用此函數:在此範例中, CrcVal01 將被評估為字串「stack-overflow」的編譯時哈希值。

以上是C 11 字串文字可以用於編譯時字串雜湊嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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