8#include "ll/api/base/Meta.h"
9#include "ll/api/base/StdInt.h"
11namespace ll::inline utils::hash_utils {
15 [[nodiscard]]
constexpr explicit HashedIdBase(
size_t hash) noexcept : hash(hash) {}
20 [[nodiscard]]
constexpr bool operator==(
HashedIdBase const& other)
const noexcept {
return hash == other.hash; }
22 [[nodiscard]]
constexpr std::strong_ordering operator<=>(
HashedIdBase const& other)
const noexcept {
23 return hash <=> other.hash;
31 [[nodiscard]]
constexpr HashCombiner(
size_t seed = 0) : seed(seed) {}
35 if constexpr (std::is_integral_v<T>) {
36 seed ^= v + 0x9e3779b9ull + (seed << 6ull) + (seed >> 2ull);
38 seed ^= std::hash<T>{}(v) + 0x9e3779b9ull + (seed << 6ull) + (seed >> 2ull);
45 for (
auto const& x : std::forward<T>(v)) {
51 [[nodiscard]]
constexpr operator size_t()
const {
return seed; }
52 [[nodiscard]]
constexpr size_t hash()
const {
return seed; }
55[[nodiscard]]
constexpr uint64 doHash(std::string_view x) {
57 uint64 hash = 0xcbf29ce484222325;
58 constexpr uint64 prime = 0x100000001b3;
66[[nodiscard]]
constexpr uint64 doHash2(std::string_view x) {
68 for (
size_t i = 0; i < x.size(); i++) {
69 rval ^= ((i & 1) == 0) ? (~((rval << 7) ^ x[i] ^ (rval >> 3))) : (~((rval << 11) ^ x[i] ^ (rval >> 5)));
74[[nodiscard]]
constexpr uint64 doHash3(std::string_view x) {
77 rval = ((rval << 5) + rval) + c;
83namespace ll::inline literals::inline hash_literals {
84[[nodiscard]]
consteval uint64
operator""_h(
char const* x,
size_t len) {
return ll::hash_utils::doHash({x, len}); }
89 requires(std::is_base_of_v<ll::hash_utils::HashedIdBase, T>)
91 size_t operator()(T
const&
id)
const noexcept {
return id.hash; }
Definition HashUtils.h:27
Definition HashUtils.h:13