README.md
# ExSha3
Pure Elixir implemtation of Keccak, SHA-3 (FIPS-202) and shake. The provided code is an experiment in porting the c-algorithm to Elixir. While it should be correct don't expect native performance.
The Elixir code is a port from:
https://github.com/status-im/nim-keccak-tiny/blob/master/keccak_tiny/keccak-tiny.c
## Installation
The package can be installed by adding `exsha3` to your list of dependencies in `mix.exs`:
```elixir
def deps do
[
{:exsha3, "~> 0.1"}
]
end
```
## This Is Slow
This is a proof of concept, and while is correct it is also really slow. Have a look at these numbers from the included benchmark script:
```
> ./benchmark.sh
=========== emu_flavor = jit ===========
Operating System: Linux
CPU Information: AMD Ryzen 7 3700U with Radeon Vega Mobile Gfx
Number of Available Cores: 8
Available memory: 15.45 GB
Elixir 1.11.4
Erlang 24.0-rc1
Benchmark suite executing with the following configuration:
warmup: 2 s
time: 5 s
memory time: 0 ns
parallel: 1
inputs: long string, short string
Estimated total run time: 28 s
Benchmarking ex_sha3_256 with input long string...
Benchmarking ex_sha3_256 with input short string...
Benchmarking nif_sha3_256 with input long string...
Benchmarking nif_sha3_256 with input short string...
##### With input long string #####
Name ips average deviation median 99th %
nif_sha3_256 4.24 K 0.24 ms ±24.26% 0.21 ms 0.48 ms
ex_sha3_256 0.00989 K 101.15 ms ±5.02% 99.30 ms 121.34 ms
Comparison:
nif_sha3_256 4.24 K
ex_sha3_256 0.00989 K - 428.71x slower +100.91 ms
##### With input short string #####
Name ips average deviation median 99th %
nif_sha3_256 283.57 K 3.53 μs ±499.14% 3.28 μs 8.17 μs
ex_sha3_256 1.61 K 621.56 μs ±18.51% 600.85 μs 1285.68 μs
Comparison:
nif_sha3_256 283.57 K
ex_sha3_256 1.61 K - 176.26x slower +618.04 μs
```