如何在Elixir中计算文件校验和?

ael*_*ton 4 erlang checksum md5 functional-programming elixir

我需要计算Elixir中文件的md5总和,如何实现?我希望有类似的东西:

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
Run Code Online (Sandbox Code Playgroud)

但显然它不起作用..

Mix.Utils的文档讲述了read_path函数链接,但它也没有用.

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

是否有任何库以简单的方式提供此类功能?

Ono*_*cci 6

万一其他人发现这个问题并错过了@ FredtheMagicWonderDog的评论...

看看这篇博文:http://www.cursingthedarkness.com/2015/04/how-to-get-hash-of-file-in-exilir.html

这是相关的代码:

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" 
Run Code Online (Sandbox Code Playgroud)

注意:我将此作为社区维基发布.我不是想得到代表点; 只是试图确保答案不在评论中.