Maison >développement back-end >C++ >Les littéraux de chaîne C 11 peuvent-ils être utilisés pour le hachage de chaîne au moment de la compilation ?
Hashage de chaînes au moment de la compilation à l'aide de littéraux de chaîne C 11
Question :
Est-ce possible de calculer le hachage d'une chaîne au moment de la compilation en utilisant la nouvelle chaîne de C 11 littéraux ?
Réponse :
Oui, c'est possible, mais cela demande de la prudence, car cela peut ne pas fonctionner avec tous les compilateurs.
Opérateur :
L'opérateur de hachage de chaîne au moment de la compilation n'est pas explicitement défini. Au lieu de cela, une expression constante est générée à l'aide d'une fonction de hachage au moment de la compilation qui prend une chaîne littérale en entrée.
Cas d'utilisation :
Un cas d'utilisation potentiel consiste à créer une instruction switch qui peut effectuer différentes actions en fonction du hachage d'une chaîne :
void foo(const std::string& value) { switch(std::hash<value>()) { case "one"_hash: one(); break; case "two"_hash: two(); break; default: other(); break; } }
Exemple Implémentation :
Voici un exemple d'implémentation utilisant une fonction constexpr :
template<size_t idx> constexpr uint32_t crc32(const char * str) { // Compile-time CRC32 implementation return (crc32<idx-1>(str) >> 8) ^ crc_table[(crc32<idx-1>(str) ^ str[idx]) & 0x000000FF]; } template<> constexpr uint32_t crc32<size_t(-1)>(const char * str) { // Stop recursion return 0xFFFFFFFF; } #define COMPILE_TIME_CRC32_STR(x) (crc32<sizeof(x) - 2>(x) ^ 0xFFFFFFFF)
Cette fonction peut être utilisée comme suit :
enum TestEnum { CrcVal01 = COMPILE_TIME_CRC32_STR("stack-overflow"), };
Dans cet exemple , CrcVal01 sera évalué selon le hachage à la compilation de la chaîne "stack-overflow."
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!