Heim > Backend-Entwicklung > C++ > Können C 11-String-Literale für String-Hashing zur Kompilierungszeit verwendet werden?

Können C 11-String-Literale für String-Hashing zur Kompilierungszeit verwendet werden?

Linda Hamilton
Freigeben: 2024-12-03 03:17:10
Original
710 Leute haben es durchsucht

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

String-Hashing zur Kompilierungszeit mit C 11-String-Literalen

Frage:

Ist es das? Es ist möglich, den Hash einer Zeichenfolge zur Kompilierungszeit mithilfe der neuen Zeichenfolge von C 11 zu berechnen Literale?

Antwort:

Ja, das ist möglich, erfordert aber Vorsicht, da es möglicherweise nicht mit allen Compilern funktioniert.

Operator:

Der Operator für String-Hashing zur Kompilierungszeit ist nicht explizit definiert. Stattdessen wird ein konstanter Ausdruck mithilfe einer Hash-Funktion zur Kompilierungszeit generiert, die ein Zeichenfolgenliteral als Eingabe verwendet.

Anwendungsfälle:

Ein möglicher Anwendungsfall ist das Erstellen eine Switch-Anweisung, die basierend auf dem Hash einer Zeichenfolge verschiedene Aktionen ausführen kann:

void foo(const std::string& value)
{
   switch(std::hash<value>())
   {
      case "one"_hash: one(); break;
      case "two"_hash: two(); break;
      default: other(); break;
   }
}
Nach dem Login kopieren

Beispiel Implementierung:

Hier ist eine Beispielimplementierung mit einer constexpr-Funktion:

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)
Nach dem Login kopieren

Diese Funktion kann wie folgt verwendet werden:

enum TestEnum
{
    CrcVal01 = COMPILE_TIME_CRC32_STR("stack-overflow"),
};
Nach dem Login kopieren

In diesem Beispiel , CrcVal01 wird zum Kompilierzeit-Hash der Zeichenfolge „stack-overflow“ ausgewertet.

Das obige ist der detaillierte Inhalt vonKönnen C 11-String-Literale für String-Hashing zur Kompilierungszeit verwendet werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage