我想为大尺寸文件创建md5。 erlang:md5 / 1的参数是'Data'。由于文件大小很大,因此不适合将整个数据读入内存。
怎么做?
此外,在mongodb-gridfs项目中,我找到了以下代码
%@doc Inserts a file with a specified bson document into the default bucket.
% The file contents can be passed as either data or a file process opened for
% reading.
Md5 = list_to_binary(bin_to_hexstr(crypto:md5(FileData))),
参数可以是io_device。
3> {ok,Io_device} = file:open("test.beam",write).
{ok,<0.60.0>}
8> Io_device.
<0.60.0>
9> crypto:md5(Io_device).
** exception error: bad argument
in function crypto:md5/1
called as crypto:md5(<0.60.0>)
shell提醒说参数是错误的,为什么?
答案 0 :(得分:4)
您应该以块的形式阅读文件并使用http://www.erlang.org/doc/man/erlang.html#md5_final-1:
erlang:md5_init/0
,erlang:md5_update/2
,erlang:md5_final/1
。或http://www.erlang.org/doc/man/crypto.html#hash-2:
crypto:hash_init(md5)
crypto:hash_update/2
crypto:hash_final/1
。答案 1 :(得分:0)
对于使用Elixir的用户,使用Dmitry的答案中的函数在Elixir中对大型文件进行哈希处理的功能是:
def hash_large_file(path, algorithm \\ :md5) do
path
|> File.stream!([], 16_384)
|> Enum.reduce(:crypto.hash_init(algorithm), fn chunk, digest ->
:crypto.hash_update(digest, chunk)
end)
|> :crypto.hash_final()
|> Base.encode16()
end