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

时间:2016-12-07 02:34:49

标签: functional-programming erlang elixir md5 checksum

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

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

但显然它不起作用..

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

eval

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

3 个答案:

答案 0 :(得分: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" 

注意:我将此作为社区维基发布。我没有试图获得重复点;只是试图确保答案不会被置于评论中。

答案 1 :(得分:2)

这也可以完成这项工作:

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

返回同一文件的md5sum程序:

$ md5sum file 
a12eb062eca9d1e6c69fcf8b603787c3  file

我使用了上面评论中提供的Ryan信息,并添加了Base.encode16以达到最终结果。

答案 2 :(得分:1)

我不知道elixir,但在erlang中,crypto:hash/2需要iodata,文件句柄不是。您需要读取文件并将内容传递给hash()。如果您知道文件相当小,{ok, Content} = file:read_file("file")(或等效的灵丹妙药)就可以了。

相关问题