> 백엔드 개발 > C++ > C 11 문자열 리터럴을 컴파일 타임 문자열 해싱에 사용할 수 있습니까?

C 11 문자열 리터럴을 컴파일 타임 문자열 해싱에 사용할 수 있습니까?

Linda Hamilton
풀어 주다: 2024-12-03 03:17:10
원래의
710명이 탐색했습니다.

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

C 11 문자열 리터럴을 사용한 컴파일 타임 문자열 해싱

질문:

그런가요? C 11의 새 문자열을 사용하여 컴파일 타임에 문자열의 해시를 계산할 수 있습니다. 리터럴?

답변:

예, 가능하지만 모든 컴파일러에서 작동하지 않을 수 있으므로 주의가 필요합니다.

연산자:

컴파일 시간 문자열 해싱에 대한 연산자는 명시적으로 지정되지 않습니다. 정의되었습니다. 대신 문자열 리터럴을 입력으로 사용하는 컴파일 타임 해시 함수를 사용하여 상수 표현식이 생성됩니다.

사용 사례:

한 가지 잠재적인 사용 사례는 다음과 같습니다. 문자열의 해시를 기반으로 다양한 작업을 수행할 수 있는 스위치 문:

void foo(const std::string& value)
{
   switch(std::hash<value>())
   {
      case "one"_hash: one(); break;
      case "two"_hash: two(); break;
      default: other(); break;
   }
}
로그인 후 복사

예 구현:

다음은 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)
로그인 후 복사

이 함수는 다음과 같이 사용할 수 있습니다.

enum TestEnum
{
    CrcVal01 = COMPILE_TIME_CRC32_STR("stack-overflow"),
};
로그인 후 복사

이 예에서는 , CrcVal01은 "stack-overflow" 문자열의 컴파일 타임 해시로 평가됩니다.

위 내용은 C 11 문자열 리터럴을 컴파일 타임 문자열 해싱에 사용할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿