如何在erlang中为大文件创建md5?密码:MD5

时间:2014-08-04 21:19:54

标签: erlang

我想为大尺寸文件创建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提醒说参数是错误的,为什么?

2 个答案:

答案 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

这些是hash names as atoms