Multihash

An Elixir implementation of the multihash specification — a self-describing hash digest format.

A multihash wraps a raw hash digest with a varint-encoded codec identifier and digest length, making the hash algorithm unambiguously identifiable from the binary data alone. This library handles hashing content, encoding the result as a multihash, and decoding multihash binaries back into their components.

Supported Hash Algorithms

Algorithm Multicodec Name
SHA-1 "sha1"
SHA-256 "sha2-256"
SHA-384 "sha2-384"
SHA-512 "sha2-512"
SHA3-224 "sha3-224"
SHA3-256 "sha3-256"
SHA3-384 "sha3-384"
SHA3-512 "sha3-512"
BLAKE2b-512 "blake2b-512"
BLAKE2s-256 "blake2s-256"
MD4 "md4"
MD5 "md5"
Identity (no-op) "identity"
SHA-256 truncated (Filecoin) "sha2-256-trunc254-padded"

Usage

Encoding

Hash content and wrap the digest in multihash format:

multihash = Multihash.encode!("hello world", "sha2-256")
# => <<18, 32, 185, 77, 39, ...>>
#    ^codec ^size ^--- digest ---

The encode/2 variant returns {:ok, binary} or :error:

{:ok, multihash} = Multihash.encode("hello world", "sha2-256")

Decoding

Extract the algorithm name, digest size, and raw digest from a multihash binary:

{algorithm, size, digest} = Multihash.decode(multihash)
# => {"sha2-256", 32, <<185, 77, 39, ...>>}

Custom hash algorithms

The Multihash.Algorithm behaviour defines the contract for hash algorithm modules:

defmodule MyApp.Blake3 do
  @behaviour Multihash.Algorithm

  @impl true
  def hash(data) when is_binary(data) do
    # ... your hashing logic, returns raw digest bytes ...
  end
end

The built-in Multihash.Identity and Multihash.SHA256Trunc254Padded modules implement this behaviour.

Dependencies

This library depends on multicodec for codec prefix encoding.

Part of the multiformats ecosystem

This library is one component of a family of Elixir multiformats libraries. For runtime codec registration and cross-component composition, see the multicodec project.