Packages

32 bit variant of the Murmur3 non-cryptographic hash function

Current section

Files

Jump to
murmur3a src murmur3a.erl
Raw

src/murmur3a.erl

-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).