mirror of
https://github.com/asdlokj1qpi233/subconverter.git
synced 2026-11-02 01:33:04 +00:00
39 lines
759 B
C++
39 lines
759 B
C++
#ifndef STRING_HASH_H_INCLUDED
|
|
#define STRING_HASH_H_INCLUDED
|
|
|
|
#include <string>
|
|
|
|
typedef uint64_t hash_t;
|
|
|
|
constexpr hash_t prime = 0x100000001B3ull;
|
|
constexpr hash_t basis = 0xCBF29CE484222325ull;
|
|
|
|
inline hash_t hash_(char const* str)
|
|
{
|
|
hash_t ret{basis};
|
|
while(*str)
|
|
{
|
|
ret ^= *str;
|
|
ret *= prime;
|
|
str++;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
inline hash_t hash_(const std::string &str)
|
|
{
|
|
return hash_(str.data());
|
|
}
|
|
|
|
constexpr hash_t hash_compile_time(char const* str, hash_t last_value = basis)
|
|
{
|
|
return *str ? hash_compile_time(str + 1, (*str ^ last_value) * prime) : last_value;
|
|
}
|
|
|
|
constexpr unsigned long long operator "" _hash(char const* p, size_t)
|
|
{
|
|
return hash_compile_time(p);
|
|
}
|
|
|
|
#endif // STRING_HASH_H_INCLUDED
|