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

3df52oht  于 2022-12-08  发布在  Erlang
关注(0)|答案(4)|浏览(214)

我需要在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

但显然它不起作用..
Mix.Utils的文档介绍了read_path/2,但它也不起作用。

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

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

c2e8gylq

c2e8gylq1#

In case anyone else finds this question and misses @FredtheMagicWonderDog's comment . . .
Check out this blog posting: http://www.cursingthedarkness.com/2015/04/how-to-get-hash-of-file-in-exilir.html
And here's the relevant code:

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: I'm posting this as community wiki. I'm not trying to get rep points; just trying to ensure the answer isn't buried in comments.

knsnq2tg

knsnq2tg2#

这也可以完成工作:

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以获得最终结果。

aiqt4smr

aiqt4smr3#

我不知道elixir,但在erlang中,crypto:hash/2接受iodata,而文件句柄不是。您需要读取文件并将内容传递给hash()。如果您知道文件相当小,{ok, Content} = file:read_file("file")(或elixir等效函数)就可以做到这一点。

n3ipq98p

n3ipq98p4#

除了@aeliton解决方案简洁漂亮外,它还拥有最好的性能。

相关问题