Compile Time String Hashing
Question: Is it possible to compute a string's hash at compile time using C 11's new string literals?
Answer: Yes, it is possible.
The operator that would look like has not been standardized yet, but it could resemble std::hash(value) or meta_hash<"string"_meta>::value.
Implementation:
A recent implementation has been developed for GCC using constexpr to create a compile-time CRC32 function. This implementation involves creating a CRC32 table and using a recursive template function to calculate the hash.
Example:
// CRC32 Table (zlib polynomial) static constexpr uint32_t crc_table[256] = { // ... }; template<size_t idx> constexpr uint32_t crc32(const char * str) { // ... } // ... #define COMPILE_TIME_CRC32_STR(x) (crc32<sizeof(x) - 2>(x) ^ 0xFFFFFFFF)
Using this macro, you can compute a compile-time CRC32 hash of a string:
enum TestEnum { CrcVal01 = COMPILE_TIME_CRC32_STR("stack-overflow"), };
Note: This implementation only works with GCC and not MSVC or Intel compilers.
The above is the detailed content of Can C 11 Compile-Time String Hashing Be Achieved?. For more information, please follow other related articles on the PHP Chinese website!