首页 > 后端开发 > 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
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板