我如何计算 Elixir 中的文件校验和?
How can I calculate a file checksum in 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
但显然它不起作用..
Mix.Utils 的文档讲述了 read_path/2,但它也没有用。
iex(22)> Mix.Utils.read_path("file", [:sha512])
{:ok, "Elixir"} #the expected was {:checksum, "<checksum_value>"}
是否有任何库以简单的方式提供此类功能?
我不知道 elixir,但在 erlang 中,crypto:hash/2
使用 iodata,而文件句柄不是。您需要读取文件并将内容传递给 hash()。如果您知道该文件相当小,{ok, Content} = file:read_file("file")
(或 elixir 等价物)就可以了。
以防其他人发现这个问题而错过了@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"
注意:我将其作为社区 Wiki 发布。我不是想获得代表积分;只是想确保答案不会埋在评论中。
这也能完成工作:
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以达到最终结果。
我需要在 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>"}
是否有任何库以简单的方式提供此类功能?
我不知道 elixir,但在 erlang 中,crypto:hash/2
使用 iodata,而文件句柄不是。您需要读取文件并将内容传递给 hash()。如果您知道该文件相当小,{ok, Content} = file:read_file("file")
(或 elixir 等价物)就可以了。
以防其他人发现这个问题而错过了@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"
注意:我将其作为社区 Wiki 发布。我不是想获得代表积分;只是想确保答案不会埋在评论中。
这也能完成工作:
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以达到最终结果。