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

Joh*_*ohn 9 c++ hash compile-time

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

换句话说,我需要这个

printf("%d", SOMEHASH("string"));
Run Code Online (Sandbox Code Playgroud)

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

push HASHVALUE
push "%d"
call printf
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*ler 7

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

因此不可能这样做.我建议你编写一个脚本来计算哈希值并将它们直接插入到源代码中,即

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

转换为

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


Ala*_*kes 6

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

(类似的技术用于I18N.)