如何从长生不老药中的地图创建`hash`或`md5`?
How to create a `hash` or `md5` from a map in elixir?
我需要将 map
转换为 hash/md5
。
map1 = %{k1: "val1", k2: "val2"}
map2 = %{k2: "val2", k1: "val1"}
以上两个地图相同,因为地图中的顺序无关紧要。
如何从地图创建散列,以便它们的散列也相同?
出于缓存目的,我需要这样做。
使用phash2/1
or phash2/2
函数,我们可以散列任何elixir/erlang项:
:erlang.phash2(map1) == :erlang.phash2(map2) # true
对于 MD5:
:crypto.hash(:md5, :erlang.term_to_binary(%{k1: "val1", k2: "val2"}))
=> <<225, 87, 188, 155, 209, 54, 124, 25, 115, 196, 104, 11, 221, 200, 140, 247>>
如果需要,您可以使用 Base
将其编码为字符串:
:crypto.hash(:md5, :erlang.term_to_binary(map)) |> Base.encode64
=> "4Ve8m9E2fBlzxGgL3ciM9w=="
:crypto.hash(:md5, :erlang.term_to_binary(map)) |> Base.encode16
=> "E157BC9BD1367C1973C4680BDDC88CF7
:crypto.hash/2
also works with:sha
、:sha256
、:blake2b
等
Above both maps are same as order doesn't matter in map. How to create a hash from map so that their hash are same too ?
值得指出的是,映射在 Elixir/Erlang 中是无序的,因此您的示例中的两个映射在内部生成相同的映射 - 源代码中键的顺序无关紧要:
%{k1: "val1", k2: "val2"} == %{k2: "val2", k1: "val1"}
=> true
我需要将 map
转换为 hash/md5
。
map1 = %{k1: "val1", k2: "val2"}
map2 = %{k2: "val2", k1: "val1"}
以上两个地图相同,因为地图中的顺序无关紧要。 如何从地图创建散列,以便它们的散列也相同?
出于缓存目的,我需要这样做。
使用phash2/1
or phash2/2
函数,我们可以散列任何elixir/erlang项:
:erlang.phash2(map1) == :erlang.phash2(map2) # true
对于 MD5:
:crypto.hash(:md5, :erlang.term_to_binary(%{k1: "val1", k2: "val2"}))
=> <<225, 87, 188, 155, 209, 54, 124, 25, 115, 196, 104, 11, 221, 200, 140, 247>>
如果需要,您可以使用 Base
将其编码为字符串:
:crypto.hash(:md5, :erlang.term_to_binary(map)) |> Base.encode64
=> "4Ve8m9E2fBlzxGgL3ciM9w=="
:crypto.hash(:md5, :erlang.term_to_binary(map)) |> Base.encode16
=> "E157BC9BD1367C1973C4680BDDC88CF7
:crypto.hash/2
also works with:sha
、:sha256
、:blake2b
等
Above both maps are same as order doesn't matter in map. How to create a hash from map so that their hash are same too ?
值得指出的是,映射在 Elixir/Erlang 中是无序的,因此您的示例中的两个映射在内部生成相同的映射 - 源代码中键的顺序无关紧要:
%{k1: "val1", k2: "val2"} == %{k2: "val2", k1: "val1"}
=> true