使用 C 11 字符串文字进行编译时字符串哈希
问题:
是吗可以使用 C 11 的新字符串在编译时计算字符串的哈希值文字?
答案:
是的,这是可能的,但需要谨慎,因为它可能不适用于所有编译器。
运算符:
编译时字符串哈希的运算符未显式定义。相反,使用以字符串文字作为输入的编译时哈希函数生成常量表达式。
用例:
一个潜在的用例是创建可以根据字符串的哈希执行不同操作的 switch 语句:
void foo(const std::string& value) { switch(std::hash<value>()) { case "one"_hash: one(); break; case "two"_hash: two(); break; default: other(); break; } }
示例实现:
这是使用 constexpr 函数的示例实现:
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)
此函数可以按如下方式使用:
enum TestEnum { CrcVal01 = COMPILE_TIME_CRC32_STR("stack-overflow"), };
在此示例中, CrcVal01 将被评估为字符串“stack-overflow”的编译时哈希值。
以上是C 11 字符串文字可以用于编译时字符串哈希吗?的详细内容。更多信息请关注PHP中文网其他相关文章!