Erlang的外部术语格式定义是否稳定?如果没有,该怎么用?

时间:2011-11-27 05:13:55

标签: erlang

Erlang外部术语格式has changed at least once(但此更改似乎早于存储在Erlang / OTP github存储库中的历史记录);显然,可以在未来发生变化。

然而,实际上,一般认为这种格式现在稳定是安全的吗?通过“稳定”,我的意思是,对于任何术语Tterm_to_binary将在任何当前或未来版本的Erlang中返回相同的二进制文件(不仅仅是它是否将返回{{1}的二进制文件将转换回与binary_to_term相同的术语。我对这个属性感兴趣,因为我想在磁盘上存储任意Erlang术语的哈希值,并且我希望现在和将来使用相同的术语来获得相同的哈希值。

如果假设术语格式稳定是不安全的,那么人们使用什么来进行有效和稳定的术语序列化?

3 个答案:

答案 0 :(得分:8)

答案 1 :(得分:3)

erlang:保证phash2是Erlang术语的稳定哈希值。

我不认为OTP在vY中提出term_to_binary(T) in vX =:= term_to_binary(T)的保证。如果他们为优化的事物表示引入新的术语代码,很多事情都可能发生变化。或者,如果我们需要将unicode字符串添加到ETF或其他东西。或者在我们引入新的基本数据类型的不太可能的未来。有关仅在外部表示中发生的更改示例(存储的术语比较相等,但不是字节相等),请参阅float_extnew_float_ext

实际上,如果你坚持使用原子,列表,元组,整数,浮点数和二进制数,那么term_to_binary可能已经安全了很长一段时间。如果他们的ETF表示发生变化的时候到了,那么您总是可以编写自己的term_to_binary版本,并且不会随着ETF的变化而变化。

答案 2 :(得分:1)

对于数据序列化,我通常在Google Protocol Buffers和JSON之间进行选择。它们都非常稳定。要使用Erlang中的这些格式,我使用PiqiErlsonmochijson2

Protobuf和JSON的一大优势在于它们可以通过设计从其他编程语言中使用,而Erlang外部术语格式或多或少地特定于Erlang。

请注意,JSON字符串表示是依赖于实现的(转义字符,浮点精度,空格等),因此它可能不适合您的用例。

与无模式格式相比,Protobuf使用起来不那么简单,但它是一个设计精良且功能强大的工具。

以下是一些需要考虑的其他无模式二进制序列化格式。我不知道他们有多稳定。可能会发现Erlang外部术语格式更稳定。