Hash 如何从elixir中的映射创建“哈希”或“md5”?
我需要将Hash 如何从elixir中的映射创建“哈希”或“md5”?,hash,elixir,md5,Hash,Elixir,Md5,我需要将映射转换为哈希/md5 map1 = %{k1: "val1", k2: "val2"} map2 = %{k2: "val2", k1: "val1"} 以上两张地图都是一样的,顺序在地图上并不重要。 如何从映射创建散列,使它们的散列也相同 出于缓存目的,我需要这样做。使用or函数,我们可以散列任何elixir/erlang术语: :erlang.phash2(map1) == :erlang.phash
映射
转换为哈希/md5
map1 = %{k1: "val1", k2: "val2"}
map2 = %{k2: "val2", k1: "val1"}
以上两张地图都是一样的,顺序在地图上并不重要。
如何从映射创建散列,使它们的散列也相同
出于缓存目的,我需要这样做。使用or函数,我们可以散列任何elixir/erlang术语:
:erlang.phash2(map1) == :erlang.phash2(map2) # true
使用or函数,我们可以散列任何elixir/erlang术语:
:erlang.phash2(map1) == :erlang.phash2(map2) # true
对于MD5:
:crypto.hash(:md5,:erlang.term_to_binary(%%{k1:val1,k2:val2}))
=>
如果需要,可以使用将其编码为字符串:
:crypto.hash(:md5,:erlang.term_to_binary(map))|>Base.encode64
=>“4Ve8m9E2fBlzxGgL3ciM9w==”
:crypto.hash(:md5,:erlang.term_to_binary(map))|>Base.encode16
=>“E157BC9BD1367C1973C4680BDDC88CF7
还有:sha
,:sha256
,:blake2b
,等等
上面两个映射都是相同的,顺序在映射中并不重要。如何从映射创建哈希,使它们的哈希也相同 值得指出的是,在Elixir/Erlang中映射是无序的,因此您的示例中的两个映射在内部生成相同的映射-源代码中键的顺序无关:
%{k1:“val1”,k2:“val2”}==%{k2:“val2”,k1:“val1”}
=>正确
对于MD5:
:crypto.hash(:md5,:erlang.term_to_binary(%%{k1:val1,k2:val2}))
=>
如果需要,可以使用将其编码为字符串:
:crypto.hash(:md5,:erlang.term_to_binary(map))|>Base.encode64
=>“4Ve8m9E2fBlzxGgL3ciM9w==”
:crypto.hash(:md5,:erlang.term_to_binary(map))|>Base.encode16
=>“E157BC9BD1367C1973C4680BDDC88CF7
还有:sha
,:sha256
,:blake2b
,等等
以上两张地图都是一样的,顺序在地图上并不重要。如何从映射创建散列,使它们的散列也相同 值得指出的是,在Elixir/Erlang中映射是无序的,因此您的示例中的两个映射在内部生成相同的映射-源代码中键的顺序无关:
%{k1:“val1”,k2:“val2”}==%{k2:“val2”,k1:“val1”}
=>正确
ETF不能保证映射中键的顺序相同,因此不能保证返回的哈希值在不同的OTP实现/版本之间是相同的。这一点很好。如果版本之间的一致性很重要,我想除了序列化到散列之前控制的自定义中间形式之外,OP的问题没有答案。ETF不能保证映射中键的顺序相同,因此,不能保证返回的哈希值在不同的OTP实现/发布之间是相同的。如果版本之间的一致性很重要,我想除了在散列之前序列化到您控制的自定义中间形式之外,OP的问题没有答案。