9

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

换句话说,我需要这个

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

编译为(在伪汇编器中)

push HASHVALUE
push "%d"
call printf

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

4

6 回答 6

7

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

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

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

转换为

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

于 2011-06-23T17:01:29.417 回答
6

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

(类似的技术用于 I18N。)

于 2011-06-23T17:14:53.687 回答
3

对于模板,只有以下语法有效: SOMEHASH<'s','t','r','i','n','g'>

看到这个例如: http ://arcticinteractive.com/2009/04/18/compile-time-string-hashing-boost-mpl/ 或 编译时字符串散列

于 2011-06-23T17:48:14.397 回答
1

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

于 2011-06-23T17:01:13.170 回答
0

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

字符串的编译时(预处理器)散列
编译时字符串散列

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

这是一篇博客文章,展示了如何使用Boost.MPL 编译时字符串散列

于 2011-06-23T17:03:51.493 回答
-2

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

于 2011-06-23T17:00:15.863 回答