constexpr
기능은 어떻습니까? 물론 해시를 구현하는 것은 어려울 수 있습니다.
// maybe another return type
constexpr uint64_t hash_metafunction(const char* input) {
// replace some_value with the hash implementation
return some_value;
}
void my_function(char const* string_ptr)
{
switch (hash_function(string_ptr))
{
case hash_metafunction("yoohooo"):
...
break;
case hash_metafunction("woooooo"):
...
break;
...
}
}
hash_metafunction
기능은 컴파일 시간에 실행됩니다 : 당신이 뭔가를해야합니다.
편집는 :
constexpr uint64_t do_the_hash(const char* input, uint64_t value_so_far) {
return *input ? do_the_hash(input + 1, (value_so_far << 8) | *input) : value_so_far;
}
constexpr uint64_t hash_metafunction(const char* input) {
return do_the_hash(input, 0);
}
라이브 데모 here : 이것은 기본적으로 uint64_t
에 입력 문자열을 변환하는 순진 구현입니다.
편집 : 나는 MD5, 당신은 소스 코드 here을 찾을 수있는 컴파일 시간을 구현했습니다. 그것을 사용하려면, 다음을 수행하십시오 "b8b4e2be16d2b11a5902b80f9c0fe6d6"
#include <iostream>
#include "md5.h"
int main() {
constexpr auto value = ConstexprHashes::md5("constexpr rulz");
std::cout << std::hex;
for(auto v : value) {
if(((size_t)v & 0xff) < 0x10)
std::cout << '0';
std::cout << ((size_t)v & 0xff);
}
std::cout << std::endl;
}
이 해시를 출력합니다.
문자열 리터럴은 템플릿 매개 변수가 될 수 없습니다. 그러나 사용자 정의 리터럴이 필요할 수도 있습니다 :''yoohooo "_hash'. –
이것이 전 처리기 마법, 즉 가변성 템플릿 'y', 'o', 'o', 'h'...를 사용하는 것이 가능한 이유입니다. – user1095108
사실, 문자열 리터럴에 대해 templaty UDL을 사용할 수 없습니다. 그러나 foo를 쓰면 물론 할 수 있습니다. –