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
Linda HamiltonOriginal
2024-12-03 03:17:10719Durchsuche

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

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)

Diese Funktion kann wie folgt verwendet werden:

enum TestEnum
{
    CrcVal01 = COMPILE_TIME_CRC32_STR("stack-overflow"),
};

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!

Stellungnahme:
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