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 ?

Les littéraux de chaîne C 11 peuvent-ils être utilisés pour le hachage de chaîne au moment de la compilation ?

Linda Hamilton
Libérer: 2024-12-03 03:17:10
original
800 Les gens l'ont consulté

Can C  11 String Literals Be Used for Compile-Time String Hashing?

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;
   }
}
Copier après la connexion

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)
Copier après la connexion

Cette fonction peut être utilisée comme suit :

enum TestEnum
{
    CrcVal01 = COMPILE_TIME_CRC32_STR("stack-overflow"),
};
Copier après la connexion

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!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal