【问题标题】:Truly compile-time string hashing in C++C++ 中真正的编译时字符串散列
【发布时间】:2011-09-21 10:02:21
【问题描述】:

基本上,我需要一个真正的 C++ 编译时字符串散列。我不关心技术细节,可以是模板,宏,任何东西。到目前为止我看到的所有其他散列技术只能在编译时生成散列表(如 256 个 CRC32 散列),而不是真正的散列。

换句话说,我需要这个

printf("%d", SOMEHASH("string"));

被编译为(在伪汇编器中)

push HASHVALUE
push "%d"
call printf

即使在调试版本中,也没有对字符串进行运行时操作。我正在使用 GCC 4.2 和 Visual Studio 2008,我需要这些编译器的解决方案(所以没有 C++0x)。

【问题讨论】:

  • 听起来像rentacoder。由于没有 C++0x 是不可能的,我猜你必须为 GCC 和 MSVC 编写编译器插件。
  • 我认为这在纯 C++ 中是不可能的。运行时对编译后的字符串进行散列的开销真的那么昂贵吗?
  • @Johannes:在 C++0x 中有可能吗?
  • @Billy ONeal:我认为它将使用用户定义的文字,不是吗?
  • @Billy:那个调用可以是 constexpr。

标签: c++ hash compile-time


【解决方案1】:

如果您不介意在代码中使用新的 C++0x 标准(一些答案还包括在旧 C++03 标准中工作的内容的链接),这些问题之前已在 StackOverflow 上提出过:

Compile-time (preprocessor) hashing of string
Compile time string hashing

这两个都包含可以帮助您弄清楚如何实现这一点的答案。

这是一篇博文,展示了如何使用Boost.MPL Compile Time String Hashing

【讨论】:

  • 如果您花时间阅读任何问题,您还会看到并非特定于 C++0x 的答案。以 Boost.MPL 为例。
【解决方案2】:

只有以下语法可以使用模板: SOMEHASH

看到这个例如: http://arcticinteractive.com/2009/04/18/compile-time-string-hashing-boost-mpl/ 要么 compile-time string hashing

【讨论】:

    【解决方案3】:

    编写您自己的预处理器,扫描源代码中的 SOMEHASH("") 并将其替换为计算的哈希值。然后将其输出传递给编译器。

    (类似的技术用于 I18N。)

    【讨论】:

    • 很想同时获得赞成票和反对票。为什么?这是一种 hack,但在某些情况下很有用,而且它似乎确实符合指定的要求。
    【解决方案4】:

    问题在于,在 C++03 中,下标字符串文字(即访问单个字符)的结果不是适合用作模板参数的编译时常量。

    因此无法做到这一点。我建议您编写一个脚本来计算哈希并将它们直接插入到源代码中,即

    printf("%d", SOMEHASH("string"));

    转换成

    printf("%d", 257359823 /*SOMEHASH("string")*/ ));

    【讨论】:

      【解决方案5】:

      为此,您必须等待 C++0x 中的用户定义文字。

      【讨论】:

        【解决方案6】:

        这不可能,它可能在 C++0x 中,但绝对不是在 C++03 中。

        【讨论】:

        • 这没有提供任何洞察力。你可能是对的,也可能是错的。看了你的回答,谁知道呢?
        猜你喜欢
        • 2011-06-25
        • 2011-02-19
        • 2021-09-05
        • 1970-01-01
        • 1970-01-01
        • 2015-04-19
        • 2013-06-25
        • 2011-04-12
        • 2017-05-03
        相关资源
        最近更新 更多