Elixir

Elixirでハッシュ関数を扱う。

More than 1 year has passed since last update.

MD5とかSHA1、SHA256とかのやつです。

Elixirには、標準モジュールに用意されていない為、

Erlangの:cryptoモジュールを使用します。


寄り道 - Rubyの場合

Elixirの前にRubyでの結果を比較するために、Rubyでハッシュ値を求めてみます。

RubyではDigestモジュールを使用すると以下のようなハッシュ値を得られます。

irb(main):016:0> Digest::SHA256.hexdigest("hogehoge")

=> "4c716d4cf211c7b7d2f3233c941771ad0507ea5bacf93b492766aa41ae9f720d"


crypto単体で使った場合

:cryptoモジュールでは、戻り値の値が、バイナリで返却されます。

扱いやすくするために文字列にエンコードする必要があります。

pry(6)> :crypto.hash(:sha256, "hogehoge")

<<76, 113, 109, 76, 242, 17, 199, 183, 210, 243, 35, 60, 148, 23, 113, 173, 5, 7, 234, 91, 172, 249, 59, 73, 39, 102, 170, 65, 174, 159, 114, 13>>


エンコードをした場合

エンコードには、Baseモジュールのencode16ファンクションを使用します。

これを行なうことで、Rubyやその他ハッシュ関数を求めるライブラリと同じ結果を得られるようになります。

pry(7)> :crypto.hash(:sha256, "hogehoge") |> Base.encode16(case: :lower)

"4c716d4cf211c7b7d2f3233c941771ad0507ea5bacf93b492766aa41ae9f720d"

実際に使う場合は以下のようなモジュールにして使っています。

defmodule Digest do

def sha256(data) do
:crypto.hash(:sha256, data) |> Base.encode16(case: :lower)
end
end

参考

https://gist.github.com/10nin/5713366

おわりです。