README.md

[![Hex.pm Version](http://img.shields.io/hexpm/v/blake3.svg?style=flat)](https://hex.pm/packages/blake3)

# Blake3

Elixir bindings for the Rust Blake3 implementation.
These bindings use [`:rustler`](https://github.com/rusterlium/rustler) to connect to the hashing functions.

## Installation

The package can be installed by adding `blake3` to your list of dependencies in `mix.exs`:

```elixir
def deps do
  [
    {:blake3, "~> 1.0"}
  ]
end
```

run `mix deps.get` and `mix deps.compile` to pull and build the bindings

## Configuration

There are feature options in the rust implementation that allow for additional SIMD instructions and multithreading. They can be set though environment variable or `Mix.Config`.

```shell
export BLAKE3_SIMD_MODE=neon
export BLAKE3_RAYON=true
```

or

```elixir
config :blake3,
   simd_mode: :neon,
   rayon: :true
```

- `neon` enables ARM NEON support
- `rayon` enables Rayon-based multithreading

When changing configuration you will need to call `mix deps.compile` to enable the features.

## Example Usage

```elixir
> Blake3.hash("foobarbaz")
#<<192, 154, 254, 224, 201, 243, 97 ...

> Blake3.new() |> Blake3.update("foo") |> Blake3.update("bar") |> Blake3.update("baz") |> Blake3.finalize()
#<<192, 154, 254, 224, 201, 243, 97 ...

> Blake3.hash("boom") |> Base.encode16(case: :lower)
#"a74bb4d1d4e44d0a2981d131762f45db9a211313d8e9f2cd151b4e673a35a6c1"
```

## Supported Elixir / Erlang / Rust

We follow Rustler itself, supporting latest three minor Elixir versions and major OTP versions.
As for Rust itself, we only support stable.

Documentation can found at [https://hexdocs.pm/blake3](https://hexdocs.pm/blake3).