42 sip_hash(detail::sip_hash_seed.k0, detail::sip_hash_seed.k1)
50 constexpr sip_hash(uint64_t k0, uint64_t k1) noexcept :
51 _v0(k0 ^ 0x736f6d6570736575),
52 _v1(k1 ^ 0x646f72616e646f6d),
53 _v2(k0 ^ 0x6c7967656e657261),
54 _v3(k1 ^ 0x7465646279746573),
59 _debug_state = debug_state_type::idle;
63 [[nodiscard]] uint64_t finish()
noexcept
66 hi_axiom(_debug_state < debug_state_type::finalized);
67 _debug_state = debug_state_type::finalized;
78 m |=
static_cast<uint64_t
>(b) << 56;
79 _compress(v0,
v1, v2, v3,
m);
80 _finalize(v0,
v1, v2, v3);
82 return v0 ^
v1 ^ v2 ^ v3;
85 void add(
void const *data,
size_t size)
noexcept
88 hi_axiom(_debug_state <= debug_state_type::partial);
89 _debug_state = debug_state_type::partial;
92 auto *src =
reinterpret_cast<char const *
>(data);
101 if (
hilet offset = _b & 7) {
105 if (offset + num_bytes == 8) {
106 _compress(v0,
v1, v2, v3, std::exchange(
m, 0));
115 m = load_le<uint64_t>(src);
118 _compress(v0,
v1, v2, v3, std::exchange(
m, 0));
131 _b =
static_cast<uint8_t
>(_b + size);
145 auto *src =
reinterpret_cast<char const *
>(data);
148 hi_axiom(_debug_state == debug_state_type::idle);
157 for (
auto block_count = size / 8; block_count > 0; --block_count, src += 8) {
158 m = load_le<uint64_t>(src);
159 _compress(v0,
v1, v2, v3,
m);
163 m = wide_cast<uint64_t>(size & 0xff) << 56;
165 _compress(v0,
v1, v2, v3,
m);
166 _finalize(v0,
v1, v2, v3);
168 return v0 ^
v1 ^ v2 ^ v3;
175 [[nodiscard]] uint64_t
operator()(
void const *data,
size_t size)
const noexcept
177 return complete_message(data, size);
189 enum class debug_state_type : uint8_t { idle, full, partial, finalized };
190 debug_state_type _debug_state;
193 hi_force_inline
static constexpr void _round(uint64_t& v0, uint64_t&
v1, uint64_t& v2, uint64_t& v3)
noexcept
197 v1 = std::rotl(
v1, 13);
198 v3 = std::rotl(v3, 16);
201 v0 = std::rotl(v0, 32);
205 v1 = std::rotl(
v1, 17);
206 v3 = std::rotl(v3, 21);
209 v2 = std::rotl(v2, 32);
212 static constexpr void _compress(uint64_t& v0, uint64_t&
v1, uint64_t& v2, uint64_t& v3, uint64_t m)
noexcept
217 for (
auto i = 0_uz; i != C; ++i) {
218 _round(v0,
v1, v2, v3);
223 static constexpr void _finalize(uint64_t& v0, uint64_t&
v1, uint64_t& v2, uint64_t& v3)
noexcept
226 for (
auto i = 0_uz; i != D; ++i) {
227 _round(v0,
v1, v2, v3);