// Dos funciones hash para cadenas: la que falla y la que usaremos.
#ifndef HASH_FUNCTIONS_H
#define HASH_FUNCTIONS_H

#include <cstdint>
#include <string>

// Puntero a una función hash: las tablas de esta carpeta la reciben al construirse.
using HashFunction = std::uint64_t (*)(const std::string&);

// Suma los bytes de la clave. Es determinista y rápida, y reparte muy mal.
inline std::uint64_t sum_hash(const std::string& key) {
    std::uint64_t hash = 0;
    for (char c : key) {
        hash += static_cast<unsigned char>(c);
    }
    return hash;
}

// FNV-1a de 64 bits, con las constantes oficiales.
inline std::uint64_t fnv1a(const std::string& key) {
    std::uint64_t hash = 14695981039346656037ULL;
    for (char c : key) {
        hash ^= static_cast<unsigned char>(c);
        hash *= 1099511628211ULL;
    }
    return hash;
}

#endif
