6#include "Stroika/Foundation/Cryptography/Digest/ResultTypes.h"
7#include "Stroika/Foundation/Cryptography/Format.h"
9namespace Stroika::Foundation::Cryptography::Digest {
17 size_t SystemHashDigester<T>::operator() (
const Streams::InputStream::Ptr<byte>& from)
const
19 Memory::BLOB b = from.ReadAll ();
20 return this->operator() (b.begin (), b.end ());
23 inline size_t SystemHashDigester<T>::operator() (
const byte* from,
const byte* to)
const
25 Require (to - from ==
sizeof (T));
26 return hash<T>{}(*
reinterpret_cast<const T*
> (from));
29 inline size_t SystemHashDigester<T>::operator() (
const BLOB& from)
const
31 return this->operator() (from.begin (), from.end ());
39 template <
typename T,
typename DIGESTER,
typename HASH_RETURN_TYPE,
typename SERIALIZER>
45 fSeed = (*this) (seed);
47 template <
typename T,
typename DIGESTER,
typename HASH_RETURN_TYPE,
typename SERIALIZER>
48 inline HASH_RETURN_TYPE Hash<T, DIGESTER, HASH_RETURN_TYPE, SERIALIZER>::operator() (
const T& t)
const
50 HASH_RETURN_TYPE result;
51 if constexpr (same_as<DIGESTER, SystemHashDigester<T>> or same_as<DIGESTER, hash<T>>) {
52 result = hash<T>{}(t);
55 result = ConvertResult<HASH_RETURN_TYPE> (DIGESTER{}(SERIALIZER{}(t)));
58 result = HashValueCombine (*fSeed, result);
70 template <
typename RESULT_TYPE>
71 inline RESULT_TYPE HashValueCombine (RESULT_TYPE lhs, RESULT_TYPE rhs)
73 if constexpr (is_arithmetic_v<RESULT_TYPE> or same_as<RESULT_TYPE, byte>) {
75 return lhs ^ (rhs << 1);
78 RESULT_TYPE result = lhs;
79 auto i = result.begin ();
80 auto ri = rhs.begin ();
81 while (i != result.end () and ri != rhs.end ()) {
82 *i = HashValueCombine (*i, *ri);
88 if constexpr (same_as<RESULT_TYPE, string>) {
89 while (ri != rhs.end ()) {
98 template <
typename RESULT_TYPE>
99 inline RESULT_TYPE HashValueCombine (RESULT_TYPE lhs, RESULT_TYPE rhs)
101 if constexpr (same_as<RESULT_TYPE, Common::GUID>) {
102 auto l = lhs.template As<array<uint8_t, 16>> ();
103 auto r = lhs.template As<array<uint8_t, 16>> ();
104 return RESULT_TYPE{Private_::HashValueCombine (l, r)};
107 return Private_::HashValueCombine (lhs, rhs);