IT 이모저모

컴파일 시간에 스트링 해쉬 구하기

exien 2018. 2. 21. 23:45
 class StringHash 
 { 
  unsigned m_val; 
 
  template<size_t N> unsigned _Hash(const char (&str)[N]) 
 
  typedef const char (&truncated_str)[N-1]; 
  return str[N-1] + 65599 * _Hash((truncated_str)str); 
 
  unsigned _Hash(const char (&str)[2]) { return str[1] + 65599 * str[0]; } 
 
 public: 
  template <size_t N> StringHash(const char (&str)[N]) { m_val = _Hash(str); } 
  operator unsigned() { return m_val; } 
 }; 


StringHash("testString"); // 이렇게 쓰면 컴파일 시간에 해쉬값이 구해진다.
     // str.c_str()을 인자로 못넣음

그래서 const char* 를 인자로 넘길때는 아래 함수를 사용 해야한다. 
아래 함수는 10자 이하까지만 컴파일 시간에 해쉬값이 구해지는듯 이상은 런타임 시간에 구해짐

unsigned int StringHash(const char *string, size_t len)
{
unsigned int hash = 0;
for(size_t i = 0; i < len + 1; ++i)
{
hash = string[i] + 65599 * hash;
}
return hash;
}


'IT 이모저모' 카테고리의 다른 글

std::numeric_limits 사용시 에러  (0) 2018.02.21
!!를 사용하는 이유  (0) 2018.02.21
Debug view  (0) 2018.02.21
__if_exists, __if_not_exists, __super  (0) 2018.02.21
Visual Studio 단축키  (0) 2018.02.21