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 |