vkmEngine 1.0.0
A C++ game engine · vkmengine.com
Loading...
Searching...
No Matches
fnv1a.h
1#pragma once
2
3#include <cstddef>
4#include <cstdint>
5#include <string_view>
6
7namespace Vkm::Engine {
8
9// 64-bit FNV-1a: non-cryptographic, deterministic across runs and platforms.
10constexpr uint64_t FNV1A_OFFSET_BASIS = 14695981039346656037ull;
11constexpr uint64_t FNV1A_PRIME = 1099511628211ull;
12
24inline uint64_t fnv1a64Bytes(const void* data, std::size_t size, uint64_t seed = FNV1A_OFFSET_BASIS) {
25 const auto* bytes = static_cast<const unsigned char*>(data);
26 uint64_t hash = seed;
27 for (std::size_t i = 0; i < size; ++i) {
28 hash ^= bytes[i];
29 hash *= FNV1A_PRIME;
30 }
31 return hash;
32}
33
41inline uint64_t fnv1a64(std::string_view s, uint64_t seed = FNV1A_OFFSET_BASIS) {
42 return fnv1a64Bytes(s.data(), s.size(), seed);
43}
44
45// 32-bit FNV-1a, for a hash that has to fit a 32-bit field.
46constexpr uint32_t FNV1A32_OFFSET_BASIS = 2166136261u;
47constexpr uint32_t FNV1A32_PRIME = 16777619u;
48
56inline uint32_t fnv1a32(std::string_view s, uint32_t seed = FNV1A32_OFFSET_BASIS) {
57 uint32_t hash = seed;
58 for (const char c : s) {
59 hash ^= static_cast<unsigned char>(c);
60 hash *= FNV1A32_PRIME;
61 }
62 return hash;
63}
64
65} // namespace Vkm::Engine