我需要将转换map
为hash/md5
。
map1 = %{k1: "val1", k2: "val2"}
map2 = %{k2: "val2", k1: "val1"}
上面两个地图都一样,在地图中顺序无关紧要。如何从地图创建哈希,以使它们的哈希也相同?
我需要这样做是为了缓存。
对于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
也可与 :sha
,:sha256
,:blake2b
等。
上面两个地图都一样,在地图中顺序无关紧要。如何从地图创建哈希,以使它们的哈希也相同?
值得指出的是,映射在Elixir / Erlang中是无序的,因此示例中的两个映射在内部生成相同的映射-源代码中键的顺序无关紧要:
%{k1: "val1", k2: "val2"} == %{k2: "val2", k1: "val1"}
=> true
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句