字符串哈希可以在编译时执行吗?
在 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中文网其他相关文章!