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;
28constexpr void hashCombine(T
const& v,
size_t& seed) {
29 seed ^= v + 0x9e3779b9ull + (seed << 6ull) + (seed >> 2ull);
33constexpr size_t hashCombineTo(T
const& v,
size_t seed) {
34 seed ^= v + 0x9e3779b9ull + (seed << 6ull) + (seed >> 2ull);
38[[nodiscard]]
constexpr uint64 doHash(std::string_view x) {
40 uint64 hash = 0xcbf29ce484222325;
41 constexpr uint64 prime = 0x100000001b3;
49[[nodiscard]]
constexpr uint64 doHash2(std::string_view x) {
51 for (
size_t i = 0; i < x.size(); i++) {
52 rval ^= ((i & 1) == 0) ? (~((rval << 7) ^ x[i] ^ (rval >> 3))) : (~((rval << 11) ^ x[i] ^ (rval >> 5)));
57[[nodiscard]]
constexpr uint64 doHash3(std::string_view x) {
60 rval = ((rval << 5) + rval) + c;
66[[nodiscard]]
constexpr uint64 hashType(std::vector<T>
const& v) {
67 size_t seed = v.size();
68 for (
auto const& x : v) {
69 hashCombine(std::hash<T>{}(x), seed);
75namespace ll::inline literals::inline hash_literals {
76[[nodiscard]]
consteval uint64
operator""_h(
char const* x,
size_t len) {
return ll::hash_utils::doHash({x, len}); }
81 requires(std::is_base_of_v<ll::hash_utils::HashedIdBase, T>)
83 size_t operator()(T
const&
id)
const noexcept {
return id.hash; }
Definition HashUtils.h:13