base/include/base/hash/constexpr_fnv1a.hpp¶
Compile-time FNV-1a hash for string interning. More...
Namespaces¶
| Name |
|---|
| cf |
| cf::hash |
Detailed Description¶
Compile-time FNV-1a hash for string interning.
Author: Charliechen114514
Version: 0.1
Since: 0.1
Date: 2026-02-25
Provides constexpr FNV-1a hashing algorithm for compile-time string hash computation. Supports both 32-bit and 64-bit variants.
Source code¶
#pragma once
#include <cstdint>
#include <string_view>
namespace cf::hash {
inline constexpr uint64_t fnv1a64_offset_basis = 14695981039346656037ULL;
inline constexpr uint64_t fnv1a64_prime = 1099511628211ULL;
inline constexpr uint32_t fnv1a32_offset_basis = 2166136261U;
inline constexpr uint32_t fnv1a32_prime = 16777619U;
constexpr uint64_t fnv1a64(const char* str, uint64_t seed = fnv1a64_offset_basis) {
return (*str == 0) ? seed
: fnv1a64(str + 1, (seed ^ static_cast<uint64_t>(*str)) * fnv1a64_prime);
}
constexpr uint64_t fnv1a64(std::string_view sv, uint64_t seed = fnv1a64_offset_basis) {
uint64_t result = seed;
for (char c : sv) {
result = (result ^ static_cast<uint64_t>(c)) * fnv1a64_prime;
}
return result;
}
constexpr uint32_t fnv1a32(const char* str, uint32_t seed = fnv1a32_offset_basis) {
return (*str == 0) ? seed
: fnv1a32(str + 1, (seed ^ static_cast<uint32_t>(*str)) * fnv1a32_prime);
}
constexpr uint32_t fnv1a32(std::string_view sv, uint32_t seed = fnv1a32_offset_basis) {
uint32_t result = seed;
for (char c : sv) {
result = (result ^ static_cast<uint32_t>(c)) * fnv1a32_prime;
}
return result;
}
constexpr uint64_t operator""_hash(const char* str, size_t) {
return fnv1a64(str);
}
} // namespace cf::hash
Updated on 2026-03-09 at 10:14:01 +0000