\hypertarget{hash_8h}{}\doxysection{kblib/hash.h File Reference} \label{hash_8h}\index{kblib/hash.h@{kblib/hash.h}} Provides generic facilities for hashing data, and aliases for standard unordered containers using the provided hash objects. {\ttfamily \#include \char`\"{}iterators.\+h\char`\"{}}\newline {\ttfamily \#include \char`\"{}tdecl.\+h\char`\"{}}\newline {\ttfamily \#include \char`\"{}traits.\+h\char`\"{}}\newline {\ttfamily \#include \char`\"{}variant.\+h\char`\"{}}\newline {\ttfamily \#include $<$climits$>$}\newline {\ttfamily \#include $<$cstdint$>$}\newline {\ttfamily \#include $<$numeric$>$}\newline {\ttfamily \#include $<$string$>$}\newline {\ttfamily \#include $<$unordered\+\_\+map$>$}\newline {\ttfamily \#include $<$unordered\+\_\+set$>$}\newline {\ttfamily \#include $<$optional$>$}\newline {\ttfamily \#include $<$string\+\_\+view$>$}\newline {\ttfamily \#include $<$variant$>$}\newline Include dependency graph for hash.\+h\+:\nopagebreak \begin{figure}[H] \begin{center} \leavevmode \includegraphics[width=350pt]{hash_8h__incl} \end{center} \end{figure} This graph shows which files directly or indirectly include this file\+:\nopagebreak \begin{figure}[H] \begin{center} \leavevmode \includegraphics[width=350pt]{hash_8h__dep__incl} \end{center} \end{figure} \doxysubsection*{Classes} \begin{DoxyCompactItemize} \item struct \mbox{\hyperlink{structkblib_1_1fnv_1_1fnv__prime_3_01std_1_1uint32__t_01_4}{kblib\+::fnv\+::fnv\+\_\+prime$<$ std\+::uint32\+\_\+t $>$}} \item struct \mbox{\hyperlink{structkblib_1_1fnv_1_1fnv__prime_3_01std_1_1uint64__t_01_4}{kblib\+::fnv\+::fnv\+\_\+prime$<$ std\+::uint64\+\_\+t $>$}} \item struct \mbox{\hyperlink{structkblib_1_1fnv_1_1fnv__prime}{kblib\+::fnv\+::fnv\+\_\+prime$<$ UInt $>$}} \begin{DoxyCompactList}\small\item\em The prime to use for the FNVa hash algorithm, as a type trait. \end{DoxyCompactList}\item struct \mbox{\hyperlink{structkblib_1_1fnv_1_1fnv__offset_3_01std_1_1uint32__t_01_4}{kblib\+::fnv\+::fnv\+\_\+offset$<$ std\+::uint32\+\_\+t $>$}} \item struct \mbox{\hyperlink{structkblib_1_1fnv_1_1fnv__offset_3_01std_1_1uint64__t_01_4}{kblib\+::fnv\+::fnv\+\_\+offset$<$ std\+::uint64\+\_\+t $>$}} \item struct \mbox{\hyperlink{structkblib_1_1fnv_1_1fnv__offset}{kblib\+::fnv\+::fnv\+\_\+offset$<$ UInt $>$}} \begin{DoxyCompactList}\small\item\em The starting value for the FNVa hash algorithm, as a type trait. \end{DoxyCompactList}\item struct \mbox{\hyperlink{structkblib_1_1padding__bits}{kblib\+::padding\+\_\+bits$<$ T $>$}} \item struct \mbox{\hyperlink{structkblib_1_1_f_n_v__hash}{kblib\+::\+FNV\+\_\+hash$<$ Key, Hash\+Int, typename $>$}} \begin{DoxyCompactList}\small\item\em The primary template has to exist, but not be constructible, in order to be compatible with std\+::hash. \end{DoxyCompactList}\item struct \mbox{\hyperlink{structkblib_1_1is__hashable}{kblib\+::is\+\_\+hashable$<$ Key, typename $>$}} \item struct \mbox{\hyperlink{structkblib_1_1is__hashable_3_01_key_00_01void__if__t_3_01std_1_1is__constructible_3_01_f_n_v__h0fe8e28e8deeee6e1cd8888a8a885a34}{kblib\+::is\+\_\+hashable$<$ Key, void\+\_\+if\+\_\+t$<$ std\+::is\+\_\+constructible$<$ FNV\+\_\+hash$<$ Key $>$ $>$\+::value $>$ $>$}} \item struct \mbox{\hyperlink{structkblib_1_1_f_n_v__hash_3_01bool_00_01_hash_int_00_01void_01_4}{kblib\+::\+FNV\+\_\+hash$<$ bool, Hash\+Int, void $>$}} \begin{DoxyCompactList}\small\item\em Hasher for bool. \end{DoxyCompactList}\item struct \mbox{\hyperlink{structkblib_1_1_f_n_v__hash_3_01char_00_01_hash_int_00_01void_01_4}{kblib\+::\+FNV\+\_\+hash$<$ char, Hash\+Int, void $>$}} \begin{DoxyCompactList}\small\item\em Hasher for char. \end{DoxyCompactList}\item struct \mbox{\hyperlink{structkblib_1_1_f_n_v__hash_3_01signed_01char_00_01_hash_int_00_01void_01_4}{kblib\+::\+FNV\+\_\+hash$<$ signed char, Hash\+Int, void $>$}} \begin{DoxyCompactList}\small\item\em Hasher for signed char. \end{DoxyCompactList}\item struct \mbox{\hyperlink{structkblib_1_1_f_n_v__hash_3_01unsigned_01char_00_01_hash_int_00_01void_01_4}{kblib\+::\+FNV\+\_\+hash$<$ unsigned char, Hash\+Int, void $>$}} \begin{DoxyCompactList}\small\item\em Hasher for unsigned char. \end{DoxyCompactList}\item struct \mbox{\hyperlink{structkblib_1_1_f_n_v__hash_3_01_t_00_01_hash_int_00_01void__if__t_3_01std_1_1is__empty_3_01_t_01_4_1_1value_01_4_01_4}{kblib\+::\+FNV\+\_\+hash$<$ T, Hash\+Int, void\+\_\+if\+\_\+t$<$ std\+::is\+\_\+empty$<$ T $>$\+::value $>$ $>$}} \begin{DoxyCompactList}\small\item\em An empty type is treated as if it were a single null byte. \end{DoxyCompactList}\item struct \mbox{\hyperlink{structkblib_1_1is__trivially__hashable}{kblib\+::is\+\_\+trivially\+\_\+hashable$<$ T $>$}} \item struct \mbox{\hyperlink{structkblib_1_1_f_n_v__hash_3_01_t_00_01_hash_int_00_01void__if__t_3_01std_1_1is__integral_3_01_599ab9b315b255c76bff3a59b2a07d79}{kblib\+::\+FNV\+\_\+hash$<$ T, Hash\+Int, void\+\_\+if\+\_\+t$<$ std\+::is\+\_\+integral$<$ T $>$\+::value and is\+\_\+trivially\+\_\+hashable\+\_\+v$<$ T $>$ $>$ $>$}} \begin{DoxyCompactList}\small\item\em Hasher for any integral type without padding type not explicitly mentioned above. \end{DoxyCompactList}\item struct \mbox{\hyperlink{structkblib_1_1_f_n_v__hash_3_01_t_00_01_hash_int_00_01void__if__t_3_01std_1_1is__pointer_3_01_t_01_4_1_1value_01_4_01_4}{kblib\+::\+FNV\+\_\+hash$<$ T, Hash\+Int, void\+\_\+if\+\_\+t$<$ std\+::is\+\_\+pointer$<$ T $>$\+::value $>$ $>$}} \begin{DoxyCompactList}\small\item\em Hasher for any pointer type. \end{DoxyCompactList}\item struct \mbox{\hyperlink{structkblib_1_1_f_n_v__hash_3_01_t_00_01_hash_int_00_01void__if__t_3_07std_1_1is__base__of_3_01s3a60a3855c96d32ad8e3e4529f547819}{kblib\+::\+FNV\+\_\+hash$<$ T, Hash\+Int, void\+\_\+if\+\_\+t$<$(std\+::is\+\_\+base\+\_\+of$<$ std\+::forward\+\_\+iterator\+\_\+tag, typename std\+::iterator\+\_\+traits$<$ T $>$\+::iterator\+\_\+category $>$\+::value and not std\+::is\+\_\+pointer$<$ T $>$\+::value and not is\+\_\+trivially\+\_\+hashable\+\_\+v$<$ T $>$ and std\+::is\+\_\+pointer$<$ typename fakestd\+::invoke\+\_\+result$<$ decltype(\&\+T\+::operator-\/$>$), T $>$\+::type $>$\+::value)$>$ $>$}} \begin{DoxyCompactList}\small\item\em Hasher for any forward iterator type. \end{DoxyCompactList}\item struct \mbox{\hyperlink{structkblib_1_1_f_n_v__hash_3_01_container_00_01_hash_int_00_01void__if__t_3_07is__contiguous__v22da9f992987654025f033c7cfb43f33}{kblib\+::\+FNV\+\_\+hash$<$ Container, Hash\+Int, void\+\_\+if\+\_\+t$<$(is\+\_\+contiguous\+\_\+v$<$ Container $>$ and is\+\_\+trivially\+\_\+hashable\+\_\+v$<$ typename Container\+::value\+\_\+type $>$)$>$ $>$}} \begin{DoxyCompactList}\small\item\em Container hasher, for contiguously-\/stored trivial elements. \end{DoxyCompactList}\item struct \mbox{\hyperlink{structkblib_1_1_f_n_v__hash_3_01_t_00_01_hash_int_00_01void__if__t_3_01not_01is__contiguous__v_3e66815ec611e56a0a8c73036102d6bbb}{kblib\+::\+FNV\+\_\+hash$<$ T, Hash\+Int, void\+\_\+if\+\_\+t$<$ not is\+\_\+contiguous\+\_\+v$<$ T $>$ and not std\+::is\+\_\+integral$<$ T $>$\+::value and not std\+::is\+\_\+pointer$<$ T $>$\+::value and is\+\_\+trivially\+\_\+hashable\+\_\+v$<$ T $>$ $>$ $>$}} \begin{DoxyCompactList}\small\item\em Hasher for any non-\/integral trivially copyable type that has no padding. \end{DoxyCompactList}\item struct \mbox{\hyperlink{structkblib_1_1_f_n_v__hash_3_01_container_00_01_hash_int_00_01void__if__t_3_01value__detected_3e9bfb9ddd66886bf87a07a71a07a8fa9}{kblib\+::\+FNV\+\_\+hash$<$ Container, Hash\+Int, void\+\_\+if\+\_\+t$<$ value\+\_\+detected$<$ Container $>$\+::value and is\+\_\+hashable\+\_\+v$<$ value\+\_\+detected\+\_\+t$<$ Container $>$ $>$ and not hash\+\_\+detected$<$ Container $>$\+::value and is\+\_\+iterable$<$ Container $>$\+::value and not(is\+\_\+contiguous$<$ Container $>$\+::value and is\+\_\+trivially\+\_\+hashable\+\_\+v$<$ typename Container\+::value\+\_\+type $>$) and not is\+\_\+iterator\+\_\+v$<$ Container $>$ $>$ $>$}} \begin{DoxyCompactList}\small\item\em Container hasher, for non-\/trivial elements (or non-\/contiguous storage) \end{DoxyCompactList}\item struct \mbox{\hyperlink{structkblib_1_1_f_n_v__hash_3_01std_1_1optional_3_01_t_01_4_00_01_hash_int_00_01void_01_4}{kblib\+::\+FNV\+\_\+hash$<$ std\+::optional$<$ T $>$, Hash\+Int, void $>$}} \item struct \mbox{\hyperlink{structkblib_1_1_f_n_v__hash_3_01void_00_01_hash_int_00_01void_01_4}{kblib\+::\+FNV\+\_\+hash$<$ void, Hash\+Int, void $>$}} \begin{DoxyCompactList}\small\item\em Transparent hasher for any hashable type. \end{DoxyCompactList}\end{DoxyCompactItemize} \doxysubsection*{Namespaces} \begin{DoxyCompactItemize} \item namespace \mbox{\hyperlink{namespacekblib}{kblib}} \begin{DoxyCompactList}\small\item\em The main namespace in which all entities from kblib are defined. \end{DoxyCompactList}\item namespace \mbox{\hyperlink{namespacekblib_1_1fnv}{kblib\+::fnv}} \item namespace \mbox{\hyperlink{namespacekblib_1_1literals}{kblib\+::literals}} \item namespace \mbox{\hyperlink{namespacekblib_1_1asserts}{kblib\+::asserts}} \item namespace \mbox{\hyperlink{namespacedetail__hash}{detail\+\_\+hash}} \item namespace \mbox{\hyperlink{namespacekblib_1_1detail__hash}{kblib\+::detail\+\_\+hash}} \end{DoxyCompactItemize} \doxysubsection*{Typedefs} \begin{DoxyCompactItemize} \item {\footnotesize template$<$typename Key $>$ }\\using \mbox{\hyperlink{namespacekblib_a681dc40a3f4186fdbc876b705fd65f99}{kblib\+::\+FNV32\+\_\+hash}} = FNV\+\_\+hash$<$ Key, std\+::uint32\+\_\+t $>$ \item {\footnotesize template$<$typename Key , typename Value $>$ }\\using \mbox{\hyperlink{namespacekblib_ae9d0249375b4e261279715b4e50e9bb3}{kblib\+::hash\+\_\+map}} = std\+::unordered\+\_\+map$<$ Key, Value, FNV\+\_\+hash$<$$>$, std\+::equal\+\_\+to$<$$>$ $>$ \item {\footnotesize template$<$typename Key , typename Value $>$ }\\using \mbox{\hyperlink{namespacekblib_a238473bf3e5a7dcc451d6ff80fd883e0}{kblib\+::hash\+\_\+multimap}} = std\+::unordered\+\_\+multimap$<$ Key, Value, FNV\+\_\+hash$<$$>$, std\+::equal\+\_\+to$<$$>$ $>$ \item {\footnotesize template$<$typename T , typename Hash\+Int $>$ }\\using \mbox{\hyperlink{namespacekblib_aba444e91f374258eb8f1594e19d54886}{kblib\+::hash\+\_\+set}} = std\+::unordered\+\_\+set$<$ T, FNV\+\_\+hash$<$$>$, std\+::equal\+\_\+to$<$$>$ $>$ \item {\footnotesize template$<$typename T , typename Hash\+Int $>$ }\\using \mbox{\hyperlink{namespacekblib_aa5f6657aa0507d58dd3eab4b0b9fc446}{kblib\+::hash\+\_\+multiset}} = std\+::unordered\+\_\+set$<$ T, FNV\+\_\+hash$<$$>$, std\+::equal\+\_\+to$<$$>$ $>$ \end{DoxyCompactItemize} \doxysubsection*{Functions} \begin{DoxyCompactItemize} \item {\footnotesize template$<$typename Integral , typename CharT $>$ }\\constexpr auto \mbox{\hyperlink{namespacekblib_ac450342ec31e16201b67e3331a23761d}{kblib\+::to\+\_\+bytes\+\_\+le}} (Integral ival, CharT(\&dest)\mbox{[}sizeof(Integral)\mbox{]}) noexcept -\/$>$ void \item {\footnotesize template$<$typename Integral , typename CharT $>$ }\\constexpr auto \mbox{\hyperlink{namespacekblib_abc19a82cefecfafd20114ebb93b218ec}{kblib\+::to\+\_\+bytes\+\_\+be}} (Integral ival, CharT(\&dest)\mbox{[}sizeof(Integral)\mbox{]}) noexcept -\/$>$ void \item {\footnotesize template$<$typename Integral , typename CharT $>$ }\\constexpr auto \mbox{\hyperlink{namespacekblib_a5ab8aca1c780d41f099cead14d4227c3}{kblib\+::to\+\_\+bytes}} (Integral val, CharT(\&dest)\mbox{[}sizeof(Integral)\mbox{]}) noexcept -\/$>$ void \item {\footnotesize template$<$typename Hash\+Int , typename Span $>$ }\\constexpr auto \mbox{\hyperlink{namespacekblib_a74d22c0d4828fcf909655abd919bf003}{kblib\+::\+FNVa}} (Span \&\&s, Hash\+Int hval=fnv\+::fnv\+\_\+offset$<$ Hash\+Int $>$\+::value) noexcept -\/$>$ Hash\+Int \begin{DoxyCompactList}\small\item\em A templatized generic FNVa hash function. \end{DoxyCompactList}\item {\footnotesize template$<$typename Hash\+Int , typename CharT , std\+::size\+\_\+t N$>$ }\\constexpr auto \mbox{\hyperlink{namespacekblib_ac550cfcd270e104a007c7b7a8fcad098}{kblib\+::\+FNVa\+\_\+a}} (const CharT(\&s)\mbox{[}N\mbox{]}, Hash\+Int hval=fnv\+::fnv\+\_\+offset$<$ Hash\+Int $>$\+::value) noexcept -\/$>$ Hash\+Int \begin{DoxyCompactList}\small\item\em A templatized FNVa hash function, for raw character arrays, such as string literals. \end{DoxyCompactList}\item constexpr auto \mbox{\hyperlink{namespacekblib_a8d67d64eac176d35844a629ff0aeacdf}{kblib\+::\+FNV32a}} (std\+::string\+\_\+view s, std\+::uint32\+\_\+t hval=fnv\+::fnv\+\_\+offset$<$ std\+::uint32\+\_\+t $>$\+::value) noexcept -\/$>$ std\+::uint32\+\_\+t \begin{DoxyCompactList}\small\item\em A standard FNV32a hash function, for string\+\_\+views. \end{DoxyCompactList}\item {\footnotesize template$<$typename Hash\+Int $>$ }\\constexpr auto \mbox{\hyperlink{namespacekblib_ab67d69cffbdb7f096d195c345df0752b}{kblib\+::\+FNVa\+\_\+s}} (const char $\ast$begin, std\+::size\+\_\+t length, Hash\+Int hval=fnv\+::fnv\+\_\+offset$<$ Hash\+Int $>$\+::value) noexcept -\/$>$ Hash\+Int \item {\footnotesize template$<$std\+::size\+\_\+t N$>$ }\\constexpr auto \mbox{\hyperlink{namespacekblib_a79a2361911fe2007b9867f8514fbcdea}{kblib\+::\+FNV32a\+\_\+a}} (const char(\&s)\mbox{[}N\mbox{]}, std\+::uint32\+\_\+t hval=fnv\+::fnv\+\_\+offset$<$ std\+::uint32\+\_\+t $>$\+::value) noexcept -\/$>$ std\+::uint32\+\_\+t \begin{DoxyCompactList}\small\item\em A standard FNV32a hash function, for raw character arrays, such as string literals. \end{DoxyCompactList}\item constexpr auto \mbox{\hyperlink{namespacekblib_a6a4c0dd6b1f34b0b9ff7e71230e68750}{kblib\+::\+FNV32a\+\_\+s}} (const char $\ast$begin, std\+::size\+\_\+t length, uint32\+\_\+t hval=fnv\+::fnv\+\_\+offset$<$ std\+::uint32\+\_\+t $>$\+::value) noexcept -\/$>$ std\+::uint32\+\_\+t \item constexpr auto \mbox{\hyperlink{namespacekblib_1_1literals_a626ed71532f5d103c9828ea9370a5842}{kblib\+::literals\+::operator\char`\"{}\char`\"{}\+\_\+fnv32}} (const char $\ast$str, std\+::size\+\_\+t length) noexcept -\/$>$ std\+::uint32\+\_\+t \begin{DoxyCompactList}\small\item\em A literal suffix that produces the FNV32a hash of a string literal. \end{DoxyCompactList}\item constexpr auto \mbox{\hyperlink{namespacekblib_1_1literals_a36cd43f6611c58129a26aba0ac78e434}{kblib\+::literals\+::operator\char`\"{}\char`\"{}\+\_\+fnv64}} (const char $\ast$str, std\+::size\+\_\+t length) noexcept -\/$>$ std\+::uint64\+\_\+t \begin{DoxyCompactList}\small\item\em A literal suffix that produces the FNV64a hash of a string literal. \end{DoxyCompactList}\item constexpr auto \mbox{\hyperlink{namespacekblib_1_1literals_a598ef69dec16cf39b62eb2967789eafc}{kblib\+::literals\+::operator\char`\"{}\char`\"{}\+\_\+fnv32}} (unsigned long long val) -\/$>$ std\+::uint32\+\_\+t \item constexpr auto \mbox{\hyperlink{namespacekblib_1_1literals_abb287d29a45213778942fec4b9aecc86}{kblib\+::literals\+::operator\char`\"{}\char`\"{}\+\_\+fnv64}} (unsigned long long val) -\/$>$ std\+::uint64\+\_\+t \item {\footnotesize template$<$typename Tuple , typename Hash\+Int , std\+::size\+\_\+t I$>$ }\\constexpr auto \mbox{\hyperlink{namespacekblib_1_1detail__hash_a138386fc0ca979aa8b320aebcf80e481}{kblib\+::detail\+\_\+hash\+::hash\+\_\+tuple\+\_\+impl}} (const Tuple \&tuple, Hash\+Int offset, std\+::index\+\_\+sequence$<$ I $>$) noexcept -\/$>$ Hash\+Int \begin{DoxyCompactList}\small\item\em Hash each element of a tuple. This overload is for tuples of a single type, or as the base case for the other overload. \end{DoxyCompactList}\item {\footnotesize template$<$typename Tuple , typename Hash\+Int , std\+::size\+\_\+t I, std\+::size\+\_\+t I2, std\+::size\+\_\+t... Is$>$ }\\constexpr auto \mbox{\hyperlink{namespacekblib_1_1detail__hash_af4f4d879d7d510def38b6d60cc74c7ec}{kblib\+::detail\+\_\+hash\+::hash\+\_\+tuple\+\_\+impl}} (const Tuple \&tuple, Hash\+Int offset, std\+::index\+\_\+sequence$<$ I, I2, Is... $>$) noexcept -\/$>$ Hash\+Int \begin{DoxyCompactList}\small\item\em Hash each element of a tuple. This overload is for tuples of at least 2 elements. \end{DoxyCompactList}\item {\footnotesize template$<$typename Tuple , std\+::size\+\_\+t... Is$>$ }\\constexpr auto \mbox{\hyperlink{namespacekblib_1_1detail__hash_a2e06c1df56bfe905c83f2eeb55fe7cdd}{kblib\+::detail\+\_\+hash\+::all\+\_\+hashable\+\_\+impl}} (std\+::index\+\_\+sequence$<$ Is... $>$) -\/$>$ bool \item {\footnotesize template$<$typename Tuple , typename std\+::enable\+\_\+if$<$(std\+::tuple\+\_\+size$<$ Tuple $>$\+::value $>$ 0u), int $>$\+::type = 0$>$ }\\constexpr auto \mbox{\hyperlink{namespacekblib_1_1detail__hash_adc7fa44ca103cd16a233a5c3a006a3a9}{kblib\+::detail\+\_\+hash\+::all\+\_\+hashable}} () -\/$>$ bool \end{DoxyCompactItemize} \doxysubsection*{Variables} \begin{DoxyCompactItemize} \item {\footnotesize template$<$typename T $>$ }\\constexpr int \mbox{\hyperlink{namespacekblib_a87295f2bf3c1f64ed3b04f4664fa2a78}{kblib\+::padding\+\_\+bits\+\_\+v}} \begin{DoxyCompactList}\small\item\em Get the number of padding bits in an integral type. \end{DoxyCompactList}\item template$<$$>$ constexpr int \mbox{\hyperlink{namespacekblib_a8265ea9f77ece8f281a9d44f9df2b295}{kblib\+::padding\+\_\+bits\+\_\+v$<$ void $>$}} = 0 \item {\footnotesize template$<$typename Key $>$ }\\\mbox{\hyperlink{tdecl_8h_a9b2376bf15765fad0ad95e4aecf36e87}{KBLIB\+\_\+\+CONSTANT\+\_\+V}} \mbox{\hyperlink{namespacekblib_a088e976f0cd633372839a9f4404f3c15}{kblib\+::is\+\_\+hashable\+\_\+v}} = is\+\_\+hashable$<$Key$>$\+::value \item {\footnotesize template$<$typename T $>$ }\\\mbox{\hyperlink{tdecl_8h_a9b2376bf15765fad0ad95e4aecf36e87}{KBLIB\+\_\+\+CONSTANT\+\_\+V}} \mbox{\hyperlink{namespacekblib_a16db4408c7a9d67eb38141aee1588ebd}{kblib\+::is\+\_\+trivially\+\_\+hashable\+\_\+v}} \item {\footnotesize template$<$typename Container $>$ }\\\mbox{\hyperlink{tdecl_8h_a9b2376bf15765fad0ad95e4aecf36e87}{KBLIB\+\_\+\+CONSTANT\+\_\+V}} \mbox{\hyperlink{namespacekblib_1_1asserts_a2ace2d4ba28e38b473b8913d5823f6c5}{kblib\+::asserts\+::is\+\_\+trivial\+\_\+container}} \end{DoxyCompactItemize} \doxysubsection{Detailed Description} Provides generic facilities for hashing data, and aliases for standard unordered containers using the provided hash objects. \begin{DoxyAuthor}{Author} killerbee \end{DoxyAuthor} \begin{DoxyDate}{Date} 2019-\/2021 \end{DoxyDate} \begin{DoxyCopyright}{Copyright} GNU General Public Licence v3.\+0 \end{DoxyCopyright} Definition in file \mbox{\hyperlink{hash_8h_source}{hash.\+h}}.