#include <stdio.h>
typedef unsigned int u32;
//
// Template version, evaluated at compile time in optimised builds
//
template <u32 N>
constexpr u32 HashFNVConst(const char(&text)[N])
{
return (HashFNVConst<N-1>((const char(&)[N - 1])text) ^ static_cast<u32>(text[N - 2])) * 16777619u;
}
template<>
constexpr u32 HashFNVConst<1>(const char(&text)[1])
{
return 2166136261u;
}
//
// Loop version, evaluated at runtime
//
u32 HashFNV(const char* text)
{
u32 hash = 2166136261u;
for (const char* c=text ; *c ; ++c)
{
hash = hash ^ static_cast<u32>(*c);
hash *= 16777619u;
}
return hash;
}
int main()
{
const char * text = "Hello";
printf("0x%x (Loop version)\n", HashFNV(text));
printf("0x%x (Template version)\n", HashFNVConst("Hello"));
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiAKdHlwZWRlZiB1bnNpZ25lZCBpbnQgdTMyOwogCi8vCi8vIFRlbXBsYXRlIHZlcnNpb24sIGV2YWx1YXRlZCBhdCBjb21waWxlIHRpbWUgaW4gb3B0aW1pc2VkIGJ1aWxkcwovLwp0ZW1wbGF0ZSA8dTMyIE4+CmNvbnN0ZXhwciB1MzIgSGFzaEZOVkNvbnN0KGNvbnN0IGNoYXIoJnRleHQpW05dKQp7CglyZXR1cm4gKEhhc2hGTlZDb25zdDxOLTE+KChjb25zdCBjaGFyKCYpW04gLSAxXSl0ZXh0KSBeIHN0YXRpY19jYXN0PHUzMj4odGV4dFtOIC0gMl0pKSAqIDE2Nzc3NjE5dTsKfQogCnRlbXBsYXRlPD4KY29uc3RleHByIHUzMiBIYXNoRk5WQ29uc3Q8MT4oY29uc3QgY2hhcigmdGV4dClbMV0pCnsKCXJldHVybiAyMTY2MTM2MjYxdTsKfQogCi8vCi8vIExvb3AgdmVyc2lvbiwgZXZhbHVhdGVkIGF0IHJ1bnRpbWUgCi8vCnUzMiBIYXNoRk5WKGNvbnN0IGNoYXIqIHRleHQpCnsKCXUzMiBoYXNoID0gMjE2NjEzNjI2MXU7Cglmb3IgKGNvbnN0IGNoYXIqIGM9dGV4dCA7ICpjIDsgKytjKQoJewoJCWhhc2ggPSBoYXNoIF4gc3RhdGljX2Nhc3Q8dTMyPigqYyk7CgkJaGFzaCAqPSAxNjc3NzYxOXU7Cgl9CglyZXR1cm4gaGFzaDsKfQogCmludCBtYWluKCkKewoJY29uc3QgY2hhciAqIHRleHQgPSAiSGVsbG8iOwoJcHJpbnRmKCIweCV4IChMb29wIHZlcnNpb24pXG4iLCBIYXNoRk5WKHRleHQpKTsKCXByaW50ZigiMHgleCAoVGVtcGxhdGUgdmVyc2lvbilcbiIsIEhhc2hGTlZDb25zdCgiSGVsbG8iKSk7CglyZXR1cm4gMDsKfQ==