编译时间字符串哈希 [英] Compile time string hashing
问题描述
我在使用C ++ 11的新的字符串有可能来计算字符串的哈希值在编译时几个不同的地方已经阅读。然而,似乎没有人准备站出来说,这将是可能的,或者它是如何做。
I have read in few different places that using C++11's new string literals it might be possible to compute a string's hash at compile time. However, no one seems to be ready to come out and say that it will be possible or how it would be done.
- 这是可能的?
- 运营商会是什么样子?
我特别感兴趣的用例这样的
I'm particularly interested use cases like this.
void foo( const std::string& value )
{
switch( std::hash(value) )
{
case "one"_hash: one(); break;
case "two"_hash: two(); break;
/*many more cases*/
default: other(); break;
}
}
注意:编译时散列函数没有看起来完全像我写的。我尽我所能去猜测最终的解决方案将是什么样子,但 meta_hash<串_meta方式> ::值
也可能是一个可行的解决方案。
Note: the compile time hash function doesn't have to look exactly as I've written it. I did my best to guess what the final solution would look like, but meta_hash<"string"_meta>::value
could also be a viable solution.
推荐答案
这是一个有点晚,但我成功地实施编译时CRC32功能配合使用的constexpr
。 ,它的问题是,在写作的时候,它只与海湾合作委员会,而不是MSVC也不是英特尔的编译器的工作原理
This is a little bit late, but I succeeded in implementing a compile-time CRC32 function with the use of constexpr
. The problem with it is that at the time of writing, it only works with GCC and not MSVC nor Intel compiler.
下面是代码片段:
// CRC32 Table (zlib polynomial)
static constexpr uint32_t crc_table[256] = {
0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L,
0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L,
0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L,
...
};
template<size_t idx>
constexpr uint32_t crc32(const char * str)
{
return (crc32<idx-1>(str) >> 8) ^ crc_table[(crc32<idx-1>(str) ^ str[idx]) & 0x000000FF];
}
// This is the stop-recursion function
template<>
constexpr uint32_t crc32<size_t(-1)>(const char * str)
{
return 0xFFFFFFFF;
}
// This doesn't take into account the nul char
#define COMPILE_TIME_CRC32_STR(x) (crc32<sizeof(x) - 2>(x) ^ 0xFFFFFFFF)
enum TestEnum
{
CrcVal01 = COMPILE_TIME_CRC32_STR("stack-overflow"),
};
CrcVal01
等于0x335CC04A
CrcVal01
is equal to 0x335CC04A
希望这会帮助你!
这篇关于编译时间字符串哈希的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!