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
Linda Hamiltonoriginal
2024-12-03 03:17:10711parcourir

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;
   }
}

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!

Déclaration:
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