Maison > développement back-end > C++ > Le hachage de chaînes au moment de la compilation en C peut-il être réalisé efficacement ?

Le hachage de chaînes au moment de la compilation en C peut-il être réalisé efficacement ?

Susan Sarandon
Libérer: 2024-12-02 22:42:10
original
592 Les gens l'ont consulté

Can C   Compile-Time String Hashing Be Achieved Efficiently?

Le hachage de chaîne peut-il être effectué au moment de la compilation ?

En C 11, des spéculations ont surgi concernant la faisabilité du calcul du hachage d'une chaîne au moment de la compilation en utilisant ses nouveaux littéraux de chaîne.

Opérateur Syntaxe

Les spécificités de la syntaxe de l'opérateur pour effectuer le hachage de chaîne au moment de la compilation restent floues. L'exemple de code proposé présentant ses cas d'utilisation suggère que l'opérateur peut ressembler au "std::hash(value)" fictif présenté ci-dessous :

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

Défis de mise en œuvre

Malgré l'apparente déclaration de switch, il existe des obstacles à la mise en œuvre à surmonter. Les chaînes constantes en C 11 sont const char* et non std::strings. Cela nécessite des étapes de conversion supplémentaires, ce qui pourrait nuire à l'efficacité.

Implémentation réussie

Une implémentation révolutionnaire d'une fonction CRC32 au moment de la compilation a été réalisée à l'aide de constexpr, mais elle est limitée à GCC. compilateurs à l'heure actuelle. Cette implémentation exploite une table CRC32 et des fonctions constexpr récursives pour calculer le hachage :

constexpr uint32_t crc32(const char * str, size_t idx = 0)
{
    return (crc32(str, idx-1) >> 8) ^ crc_table[(crc32(str, idx-1) ^ str[idx]) & 0x000000FF];
}
constexpr uint32_t crc32(const char * str, size_t(-1))
{
    return 0xFFFFFFFF;
}
#define COMPILE_TIME_CRC32_STR(x) (crc32(x) ^ 0xFFFFFFFF)
Copier après la connexion

En utilisant cette implémentation, on peut calculer le hachage CRC32 au moment de la compilation d'une chaîne comme ceci :

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

Cela attribue la valeur 0x335CC04A à CrcVal01, démontrant l'application pratique de la chaîne de compilation hachage.

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!

source:php.cn
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