跳转至

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