在C++中真正的编译时字符串哈希

9

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

换句话说,我需要这个功能:

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

编译为(伪汇编语言)

push HASHVALUE
push "%d"
call printf

即使在Debug版本中,字符串也没有运行时操作。我使用的是GCC 4.2和Visual Studio 2008,我需要解决方案适用于这些编译器(因此不能使用C++0x)。请保留HTML标记。

我认为在纯C++中这是不可能的。运行时哈希编译后的字符串的开销真的那么昂贵吗? - Billy ONeal
@Johannes:在C++0x中有可能吗? - Billy ONeal
@Billy,有几个人证明了在C++0x中可以在编译时对字符串字面量进行操作。 - Johannes Schaub - litb
4
那个调用可以是常量表达式。 - Puppy
@DeadMG:哦!太棒了!(迫不及待地等待编译器完成实现这个东西……) - Billy ONeal
显示剩余4条评论
6个回答

7
在C++03中,问题在于对字符串字面值进行下标操作(即访问单个字符)的结果不是编译时常量,不能用作模板参数。
因此这是不可能的。建议您编写脚本来计算哈希值并直接插入源代码中,例如: printf("%d", SOMEHASH("string")); 转换为: printf("%d", 257359823 /*SOMEHASH("string")*/ ));

6

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

(类似的技术也用于I18N。)


1
对此既获得赞同又获得反对感到很有兴趣。为什么?这是一个技巧,但在某些情况下非常有用,并且似乎符合指定的要求。 - Alan Stokes

3

1
你需要等待C++0x中的用户自定义字面量来完成这个任务。

0

如果你花时间阅读任何一个问题,你也会看到不特定于C++0x的答案,例如包括Boost.MPL。 - X-Istence

-2

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


1
这并没有提供任何见解。你可能是对的,也可能是错的。从你的回答中看不出来。 - quant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接