2016-12-07 4 views
2

私はElixirのファイルのmd5の合計を計算する必要がありますが、これはどのように達成できますか? 私は何かのようなことを期待する:Mix.Utilsのエリクサーでファイルチェックサムを計算するにはどうすればよいですか?

iex(15)> {:ok, f} = File.open "file" 
{:ok, #PID<0.334.0>} 
iex(16)> :crypto.hash(:md5, f) 
** (ArgumentError) argument error 
      :erlang.iolist_to_binary(#PID<0.334.0>) 
    (crypto) crypto.erl:225: :crypto.hash/2 

しかし、はっきり、それは動作しません。..

ドキュメントはread_path機能linkについて伝えますが、それはどちらかの仕事をしませんでした。

iex(22)> Mix.Utils.read_path("file", [:sha512]) 
{:ok, "Elixir"} #the expected was {:checksum, "<checksum_value>"} 

このような機能を簡単に提供するライブラリはありますか?

+0

Releventブログ記事:http://www.cursingthedarkness.com/2015/04/how-to-get-hash-of-file-in-exilir.html –

答えて

5

他の誰かがこの質問を見つけ、@ FredtheMagicWonderDogのコメントを逃した場合。 。 。

チェックアウト、このブログの投稿:

File.stream!("./known_hosts.txt",[],2048) 
|> Enum.reduce(:crypto.hash_init(:sha256),fn(line, acc) -> :crypto.hash_update(acc,line) end) 
|> :crypto.hash_final 
|> Base.encode16 


#=> "97368E46417DF00CB833C73457D2BE0509C9A404B255D4C70BBDC792D248B4A2" 

NB:ここhttp://www.cursingthedarkness.com/2015/04/how-to-get-hash-of-file-in-exilir.html

とは、関連するコードだ私はコミュニティのwikiとしてこれを掲示しています。私は代表点を取得しようとしていません。その答えがコメントに埋もれていないことを保証しようとするだけです。

2

エリキシルは分かりませんが、適切なエルランでは、crypto:hash/2はファイルハンドルではないヨードアームを取ります。ファイルを読み込んで内容をhash()に渡す必要があります。ファイルがかなり小さいことがわかっている場合は、{ok, Content} = file:read_file("file")(または同等のエリクサー)がそのトリックを行います。

1

これも仕事をしていません:

iex(25)> {:ok, content} = File.read "file" 
{:ok, "Elixir"} 
iex(26)> :crypto.hash(:md5, content) |> Base.encode16 
"A12EB062ECA9D1E6C69FCF8B603787C3" 

同じファイルのmd5sumプログラムが返さ:

$ md5sum file 
a12eb062eca9d1e6c69fcf8b603787c3 file 

私はライアンは、上記のコメントに提供された情報を使用し、ベースを追加しました。最終結果に達するようencode16します。

関連する問題