字串雜湊可以在編譯時執行嗎?
在 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中文網其他相關文章!