summaryrefslogtreecommitdiff
path: root/src/exxhash/src/exxhash.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/exxhash/src/exxhash.erl')
-rw-r--r--src/exxhash/src/exxhash.erl55
1 files changed, 55 insertions, 0 deletions
diff --git a/src/exxhash/src/exxhash.erl b/src/exxhash/src/exxhash.erl
new file mode 100644
index 000000000..b2274772d
--- /dev/null
+++ b/src/exxhash/src/exxhash.erl
@@ -0,0 +1,55 @@
+% Licensed under the Apache License, Version 2.0 (the "License"); you may not
+% use this file except in compliance with the License. You may obtain a copy of
+% the License at
+%
+% http://www.apache.org/licenses/LICENSE-2.0
+%
+% Unless required by applicable law or agreed to in writing, software
+% distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+% WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+% License for the specific language governing permissions and limitations under
+% the License.
+
+-module(exxhash).
+
+-on_load(init/0).
+
+-export([
+ xxhash128/1
+]).
+
+-nifs([
+ xxhash128_plain_nif/1,
+ xxhash128_dirty_nif/1
+]).
+
+% It takes about 50 usec to hash a 1MB block
+-define(DIRTY_THRESHOLD, 1048576).
+
+xxhash128(Bin) when is_binary(Bin) ->
+ case byte_size(Bin) =< ?DIRTY_THRESHOLD of
+ true ->
+ {H, L} = xxhash128_plain_nif(Bin),
+ <<H:64, L:64>>;
+ false ->
+ {H, L} = xxhash128_dirty_nif(Bin),
+ <<H:64, L:64>>
+ end.
+
+init() ->
+ PrivDir =
+ case code:priv_dir(?MODULE) of
+ {error, _} ->
+ EbinDir = filename:dirname(code:which(?MODULE)),
+ AppPath = filename:dirname(EbinDir),
+ filename:join(AppPath, "priv");
+ Path ->
+ Path
+ end,
+ erlang:load_nif(filename:join(PrivDir, "exxhash"), 0).
+
+xxhash128_plain_nif(_) ->
+ erlang:nif_error(nif_not_loaded).
+
+xxhash128_dirty_nif(_) ->
+ erlang:nif_error(nif_not_loaded).