Bash md5不是由Elixir md5创建者设置的

时间:2017-09-30 14:36:26

标签: elixir

用于验证2系统中的文件大小。我确实创建了像elixir中的一样的代码

def file_md5_creator do
    filepath = "/Users/shahryar/Desktop/test.jpg"       
    File.stream!(filepath) |>
    Enum.reduce(:crypto.hash_init(:md5),
    fn(line, acc) -> :crypto.hash_update(acc,line) end ) |>
    :crypto.hash_final |> Base.encode16(case: :lower)
end

但是elix md5创建者没有设置Bash md5

  

elixir md5:ee4ed0f9c357b7d803d08f7d75dd983b

     

bash:53a3107b118854f20c5af6269a434981

bash command =

md5 /Users/shahryar/Desktop/test.jpg

我的操作系统:mac

请求帮我解决问题

1 个答案:

答案 0 :(得分:1)

File.stream!默认读取" line"中的文件将"\r\n"换行符序列规范化为"\n"的模式。

iex(1)> File.write!("a", "a\r\nb\r\nc")
:ok
iex(2)> File.read!("a")
"a\r\nb\r\nc"
iex(3)> File.stream!("a") |> Enum.into("")
"a\nb\nc"

要使File.stream!不这样做,可以通过指定一个整数作为第三个参数(即一次读取的字节数),使其以字节模式读取。

iex(4)> File.stream!("a", [], 16384) |> Enum.into("")
"a\r\nb\r\nc"

您的图片在多个位置包含"\r\n",这意味着原始数据已被File.stream!损坏,并且您获得了错误的MD5哈希值。如果您将File.stream!调用的第三个参数更改为整数,它应该可以正常工作:

File.stream!(filepath, [], 16384) |>