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; } }
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)
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"), };
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!