首页 > 后端开发 > Golang > Go 的 `encoding/gob` 编码是确定性的吗?如何实现确定性的输出?

Go 的 `encoding/gob` 编码是确定性的吗?如何实现确定性的输出?

Linda Hamilton
发布: 2024-12-02 03:50:10
原创
266 人浏览过

Is Go's `encoding/gob` Encoding Deterministic, and How Can Deterministic Output Be Achieved?

编码/Gob 中的确定性

背景

对 x 和 y 类型的对象进行编码时转换为 GOB 格式时,一个常见的期望是 gob_encode(x) 和假设对象相等,gob_encode(y) 将始终生成相同的字节序列。

GOB 编码的确定性

encoding/gob 提供了非确定性实现涉及地图时的 GOB 编码。这种不确定性源于映射的任意迭代顺序,导致编码期间序列化顺序不一致。

类型说明符的影响

但是,对于非映射值,编码/gob 实现了确定性方法。这是因为 GOB 流中的每个数据项都以类型说明符为前缀。流中第一次出现的类型包含完整的类型定义。相同类型的后续出现使用引用或标识符来引用初始类型规范。

示例

在下面的示例中,我们创建一个自定义 struct Int 并对其进行编码多次使用 gob编码器。

type Int struct{ X int }
b := new(bytes.Buffer)
e := gob.NewEncoder(b)
e.Encode(Int{1})
fmt.Println(b.Bytes())
e.Encode(Int{1})
fmt.Println(b.Bytes())
登录后复制

输出:

[23 255 129 3 1 1 3 73 110 116 1 255 130 0 1 1 1 1 88 1 4 0 0 0 5 255 130 1 2 0]
[23 255 129 3 1 1 3 73 110 116 1 255 130 0 1 1 1 1 88 1 4 0 0 0 5 255 130 1 2 0 5 255 130 1 2 0]
登录后复制

虽然初始编码包含完整的类型定义,但后续编码仅传输类型引用,从而产生不同的字节序列。

含义

一般来说,除非你严格要求确定性输出,不必担心上述行为。

但是,重要的是要注意,可以通过避免使用映射并使用具有相同编码值顺序的多个编码器来实现确定性输出.

此外,Go 版本之间编码/gob 实现的更改可能会影响输出的一致性。保持兼容性,但确切的输出可能会有所不同。

以上是Go 的 `encoding/gob` 编码是确定性的吗?如何实现确定性的输出?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板