在C ++中真正的编译时字符串散列

时间:2011-06-23 16:58:01

标签: c++ hash compile-time

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

换句话说,我需要这个

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

编译为(在伪汇编程序中)

push HASHVALUE
push "%d"
call printf

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

6 个答案:

答案 0 :(得分:7)

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

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

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

转换为

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

答案 1 :(得分:6)

编写自己的预处理器,扫描源以获取SOMEHASH(“”)并将其替换为计算的哈希值。然后将其输出传递给编译器。

(类似的技术用于I18N。)

答案 2 :(得分:3)

使用模板时,只有以下语法才有效: SOMEHASH< 'S', 'T', 'R', 'I', 'N', 'G' >

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

答案 3 :(得分:1)

你必须在C ++ 0x中等待用户定义的文字。

答案 4 :(得分:0)

如果您不介意在代码中使用新的C ++ 0x标准(某些答案还包含指向旧版C ++ 03标准中的内容的链接),那么之前在StackOverflow上已经提出过这些问题:< / p>

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

这两个问题都包含有助于您弄清楚如何实现这一目标的答案。

以下是一篇博文,介绍如何使用Boost.MPL Compile Time String Hashing

答案 5 :(得分:-2)

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