Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hash 如何从elixir中的映射创建“哈希”或“md5”?_Hash_Elixir_Md5 - Fatal编程技术网

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的问题没有答案。