-module(murmur3a). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]). -export([int_digest/1, bit_array_digest/1, hex_digest/1, hash_ints/2, hash_string/2]). -export_type([hash/0]). -opaque hash() :: {hash, integer(), integer(), integer()}. -file("/home/eaon/Projects/Reach/misc/murmur3/murmur3a/src/murmur3a.gleam", 117). -spec int_digest(hash()) -> integer(). int_digest(Hash) -> erlang:element(4, Hash). -file("/home/eaon/Projects/Reach/misc/murmur3/murmur3a/src/murmur3a.gleam", 130). -spec bit_array_digest(hash()) -> bitstring(). bit_array_digest(Hash) -> <<(int_digest(Hash)):32>>. -file("/home/eaon/Projects/Reach/misc/murmur3/murmur3a/src/murmur3a.gleam", 143). -spec hex_digest(hash()) -> binary(). hex_digest(Hash) -> _pipe = Hash, _pipe@1 = bit_array_digest(_pipe), gleam_stdlib:base16_encode(_pipe@1). -file("/home/eaon/Projects/Reach/misc/murmur3/murmur3a/src/murmur3a.gleam", 177). -spec rotate_left(integer(), integer()) -> integer(). rotate_left(N, Shift) -> N@1 = erlang:'band'(N, 16#ffffffff), _pipe = erlang:'bsl'(N@1, Shift), _pipe@1 = erlang:'band'(_pipe, 16#ffffffff), erlang:'bor'(_pipe@1, erlang:'bsr'(N@1, 32 - Shift)). -file("/home/eaon/Projects/Reach/misc/murmur3/murmur3a/src/murmur3a.gleam", 173). -spec overflow(integer()) -> integer(). overflow(Overflow) -> (gleam@int:subtract(Overflow, -2147483648) rem 16#100000000) + -2147483648. -file("/home/eaon/Projects/Reach/misc/murmur3/murmur3a/src/murmur3a.gleam", 160). -spec signed_multiply(integer(), integer()) -> integer(). signed_multiply(M, N) -> case M * N of Amount when Amount > 16#7fffffff -> overflow(Amount); Amount@1 when Amount@1 < -2147483648 -> overflow(gleam@int:subtract(Amount@1, -2147483648)); Amount@2 -> Amount@2 end. -file("/home/eaon/Projects/Reach/misc/murmur3/murmur3a/src/murmur3a.gleam", 64). -spec mix(integer(), integer()) -> integer(). mix(State, Seed) -> _pipe = State, _pipe@1 = signed_multiply(_pipe, 16#cc9e2d51), _pipe@2 = rotate_left(_pipe@1, 15), _pipe@3 = signed_multiply(_pipe@2, 16#1b873593), _pipe@4 = erlang:'bxor'(_pipe@3, Seed), _pipe@5 = rotate_left(_pipe@4, 13), _pipe@6 = signed_multiply(_pipe@5, 5), gleam@int:add(_pipe@6, 16#e6546b64). -file("/home/eaon/Projects/Reach/misc/murmur3/murmur3a/src/murmur3a.gleam", 51). -spec hash_chunk(hash(), integer()) -> hash(). hash_chunk(Hash, Chunk) -> State = begin _pipe = Chunk, _pipe@1 = erlang:'band'(_pipe, 16#ff), _pipe@2 = erlang:'bsl'(_pipe@1, erlang:element(3, Hash)), erlang:'bor'(_pipe@2, erlang:element(4, Hash)) end, case erlang:element(3, Hash) of 24 -> {hash, mix(State, erlang:element(2, Hash)), 0, 0}; _ -> _record = Hash, {hash, erlang:element(2, _record), erlang:element(3, Hash) + 8, State} end. -file("/home/eaon/Projects/Reach/misc/murmur3/murmur3a/src/murmur3a.gleam", 75). -spec finalize(hash(), integer()) -> hash(). finalize(Hash, Length) -> State = begin _pipe@5 = case erlang:element(4, Hash) of 0 -> erlang:element(2, Hash); _ -> _pipe = erlang:element(4, Hash), _pipe@1 = signed_multiply(_pipe, 16#cc9e2d51), _pipe@2 = rotate_left(_pipe@1, 15), _pipe@3 = signed_multiply(_pipe@2, 16#1b873593), _pipe@4 = erlang:'bxor'(_pipe@3, erlang:element(2, Hash)), erlang:'band'(_pipe@4, 16#ffffffff) end, erlang:'bxor'(_pipe@5, Length) end, State@1 = begin _pipe@6 = erlang:'bsr'(State, 16), _pipe@7 = erlang:'bxor'(_pipe@6, State), _pipe@8 = signed_multiply(_pipe@7, 16#85ebca6b), erlang:'band'(_pipe@8, 16#ffffffff) end, State@2 = begin _pipe@9 = erlang:'bsr'(State@1, 13), _pipe@10 = erlang:'bxor'(_pipe@9, State@1), signed_multiply(_pipe@10, 16#c2b2ae35) end, _record = Hash, {hash, erlang:element(2, _record), erlang:element(3, _record), begin _pipe@11 = erlang:'bsr'(State@2, 16), _pipe@12 = erlang:'band'(_pipe@11, 16#ffff), erlang:'bxor'(_pipe@12, State@2) end}. -file("/home/eaon/Projects/Reach/misc/murmur3/murmur3a/src/murmur3a.gleam", 45). -spec hash_ints(list(integer()), integer()) -> hash(). hash_ints(Key, Seed) -> _pipe = Key, _pipe@1 = gleam@list:fold(_pipe, {hash, Seed, 0, 0}, fun hash_chunk/2), finalize(_pipe@1, erlang:length(Key)). -file("/home/eaon/Projects/Reach/misc/murmur3/murmur3a/src/murmur3a.gleam", 30). -spec hash_string(binary(), integer()) -> hash(). hash_string(Key, Seed) -> _pipe = Key, _pipe@1 = gleam@string:to_utf_codepoints(_pipe), _pipe@2 = gleam@list:map(_pipe@1, fun gleam_stdlib:identity/1), hash_ints(_pipe@2, Seed).